Slices

It often happens that we need to work with a few elements from a given list. For example, the Bedrock Library keeps information about their patrons in a large file.[352] 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 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 the fields it needs:

    while (<FILE>) {
      chomp;
      my @items = split /:/;
      my($card_num, $count) = ($items[1], $items[5]);
      ...  # now work with those two variables
    }

The array @items isn’t needed for anything else though, so it seems like a waste.[353] 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 /:/;

That avoids the unneeded array @items, but now we have four scalar variables that we didn’t need. For this situation, some people used to make up a number of dummy variable names, like $dummy_1, that showed they didn’t care about that element from the split. Larry thought that was too much trouble, so he added a special use of undef. If an item in a list being assigned to is ...

Get Learning Perl, Fourth Edition now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.