Chinaunix首页 | 论坛 | 博客
  • 博客访问: 34397
  • 博文数量: 14
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-09 09:40
文章分类

全部博文(14)

文章存档

2011年(1)

2008年(13)

我的朋友
最近访客

分类:

2008-07-11 11:11:37

对于perl里的grep和map,记住一点,凡属希望从数组里提取符合某些条件的元素形成子数组的,用grep,凡属希望从数组里提取出来的元素经过处理后再赋值给新数组的,用map
 
grep语句的返回值永远是数组,不过用于scalar context下的时候,就返回了数组的元素个数。
 
下面记录些复杂例子:
 
my @input_numbers = (1, 2, 4, 8, 16, 32, 64);
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 @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;
阅读(1321) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~