Perl中grep和map使用进阶例子记录 z

本文详细介绍了Perl语言中grep和map函数的应用场景及复杂示例,grep用于筛选符合条件的元素,而map则用于处理数组元素并生成新数组。通过具体的代码示例展示了如何使用这两个函数来实现特定的数据处理任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


对于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;

<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值