Transforming Items from a List with map
Another common task is transforming items from a list. For
example, suppose we have a list of numbers that should be formatted as
“money numbers” for output, as with the subroutine &big_money (from Chapter 14). But we don’t want to modify the
original data; we need a modified copy of the list just for output.
Here’s one way to do that:
my @data = (4.75, 1.5, 2, 1234, 6.9456, 12345678.9, 29.95);
my @formatted_data;
foreach (@data) {
push @formatted_data, &big_money($_);
}That looks similar in form to the example code used at the
beginning of the section on grep,
doesn’t it? So it may not surprise you that the replacement code
resembles the first grep
example:
my @data = (4.75, 1.5, 2, 1234, 6.9456, 12345678.9, 29.95);
my @formatted_data = map { &big_money($_) } @data;The map operator looks
much like grep because it has the
same kind of arguments: a block that uses $_, and a list of items to process. And it
operates in a similar way, evaluating the block once for each item in
the list, with $_ aliased to a
different original list element each time. But the last expression of
the block is used differently; instead of giving a Boolean value, the
final value actually becomes part of the resulting list.[*] Any grep or map statement could be rewritten as a foreach loop pushing items onto a temporary
array. But the shorter way is typically more efficient and more
convenient. Since the result of map
or grep is a list, it can be passed directly to another ...