Slices
It often happens that we need to work with only a few elements from a given list. For example, the Bedrock Library keeps information about their patrons in a large file.[*] Each line in the file describes one patron with six colon-separated fields: a person’s name, library card number, home address, home phone number, work phone number, and number of items currently checked out. A little bit of the file looks something like this:
fred flintstone:2168:301 Cobblestone Way:555-1212:555-2121:3 barney rubble:709918:3128 Granite Blvd:555-3333:555-3438:0
One of the library’s applications needs only the card numbers and number of items checked out; it doesn’t use any of the other data. It could use code something like this to get only the fields it needs:
while (<FILE>) {
chomp;
my @items = split /:/;
my($card_num, $count) = ($items[1], $items[5]);
... # now work with those two variables
}But the array @items isn’t
needed for anything else; it seems like a waste.[*] Maybe it would be better to assign the result of split to a list of scalars, like this:
my($name, $card_num, $addr, $home, $work, $count) = split /:/;
Well, that avoids the unneeded array @items—but now we have four scalar variables
that we didn’t really need. For this situation, some people used to make
up a number of dummy variable names, like $dummy_1, that showed that they really didn’t
care about that element from the split. But Larry thought that that was too
much trouble, so he added a special use of undef. If an item ...