http://perlmeme.org/howtos/perlfunc/map_function.html
summary
summary
Using the Perl map() function
Introduction
The
map
function is used for transforming lists element-wise: given a list and a code block, map
builds a new list (or hash) with elements derived from the corresponding elements of the original.
The basic syntax is
@out = map { CODE } @in;
where
CODE
is some perl code that is given an element of the list as $_
and returns the replacement value for the new list.Example 1
Say you have a list of names, and you want to capitalise them all. We can use
map
along with the built-in function ucfirst
to do them all at once:#!/usr/bin/perl use strict; use warnings; my @names = qw(bob anne frank jill); my @capitalised_names = map { ucfirst $_ } @names; foreach my $name (@capitalised_names) { print "$name\n"; }
This produces the output:
Bob Anne Frank Jill
Example 2: Multiple outputs per input
If your code block returns a list for each element, all the lists are concatenated into the result:
#!/usr/bin/perl use strict; use warnings; my @names = qw(bob anne frank jill); my @everyone = map { $_, $_ . "'s dog", $_ . "'s cat" } @names; foreach my $name (@everyone) { print "$name\n"; }
This produces the output:
bob bob's dog bob's cat anne anne's dog anne's cat frank frank's dog frank's cat jill jill's dog jill's cat
Example 3: Producing a hash as output
Generating a hash is almost identical to earlier examples:
#!/usr/bin/perl use strict; use warnings; my @names = qw(bob anne frank jill); my %lengths = map { $_ => length $_ } @names; while (my ($name, $length) = each %lengths) { print "'$name' has $length characters\n"; }
This produces the output:
'bob' has 3 characters 'anne' has 4 characters 'frank' has 5 characters 'jill' has 4 characters
Example 4: Restructuring data
Say you have some data stored as a list of hashrefs and you want to convert it to a hash based on some key field
id
.#!/usr/bin/perl use strict; use warnings; my @array = ({ id => 1, name => 'Bob', },{ id => 2, name => 'Anne', },{ id => 3, name => 'Frank' }); my %hash = map { $_->{id} => { name => $_->{name} } } @array; for my $id (1..3) { my $name = $hash{$id}->{name}; print "User $id: $name\n"; }
This produces the output:
User 1: Bob User 2: Anne User 3: Frank
See also
perldoc -f map
No comments:
Post a Comment