对于perl里的grep和map,记住一点,凡属希望从数组里提取符合某些条件的元素形成子数组的,用grep,凡属希望从数组里提取出来的元素经过处理后再赋值给新数组的,用map
grep语句的返回值永远是数组,不过用于scalar context下的时候,就返回了数组的元素个数。
下面记录些复杂例子:
my @indices_of_odd_digit_sums = grep {
...
} 0..$#input_numbers;
my @indices_of_odd_digit_sums = grep {
my $number = $input_numbers[$_];
my $sum;
$sum += $_ for split //, $number;
$sum % 2;
} 0..$#input_numbers
my $number = $input_numbers[$_];
my $sum;
$sum += $_ for split //, $number;
$sum % 2;
} 0..$#input_numbers
my @odd_digit_sums = @input_numbers[ @indices_of_odd_digit_sums ];
my @bigger_indices = grep { if ($_ > $#y or $x[$_] > $y[$_]) { 1; # yes, select it } else { 0; # no, don't select it } } 0..$#x; my @bigger = @x[@bigger_indices];
my @bigger_indices = grep { $_ > $#y or $x[$_] > $y[$_]; } 0..$#x; my @bigger = @x[@bigger_indices];
my @bigger = map { if ($_ > $#y or $x[$_] > $y[$_]) { $x[$_]; } else { ( ); } } 0..$#x;
my %provisions = ( 'The Skipper' => [qw(blue_shirt hat jacket preserver sunscreen)], 'The Professor' => [qw(sunscreen water_bottle slide_rule radio) ], 'Gilligan' => [qw(red_shirt hat lucky_socks water_bottle) ], );
my @packed_light = grep @{ $provisions{$_} } < 5, keys %provisions;
my @all_wet = grep { my @items = @{ $provisions{$_} }; grep $_ eq 'water_bottle', @items; #这里grep返回的其实仍然是数组,只是外层的grep需要一个scalar的参数,所以数组在scalar的context下就变成了数组元素的个数 } keys %provisions;
以上一段代码其实是下面这个更清晰版本的简写版
my @all_wet = grep { my @items = @{ $provisions{$_} }; @water=grep $_ eq 'water_bottle', @items;
scalare @water; #grep的第一个参数必须返回一个boolean值
} keys %provisions;
以下没看懂~
my @remapped_list = map { [ $_ => $provisions{$_} ]; #这是一种奇怪的用法,匿名数组里面用=>符号,其实改成[$_,$provisions{$_}];一样 } keys %provisions;
my @person_item_pairs = map { my $person = $_; my @items = @{ $provisions{$person} }; map [$person => $_], @items;#这里等价于@temp=map [$person => $_], @items;@temp;
} keys %provisions;
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>