如果有一个(Perl),在数组中找到符合特定条件的项目?

CW *_* II 4 arrays perl

是否存在Perl习惯用法,用于在符合特定条件的数组中查找项目(如果有)?

my $match = 0;
foreach(@list){
   if (match_test($_)){
      $result = $_;
      $match = 1;
      last;
      }
   }
$match || die("No match.");
say $result, " is a match.";
Run Code Online (Sandbox Code Playgroud)

这个例子看起来有点尴尬.我希望Perl能够更干净地处理这个问题.

Eri*_*rom 14

是的,grep就是你要找的:

my @results = grep {match_test($_)} @list;
Run Code Online (Sandbox Code Playgroud)

grep返回@listwhere match_test返回true 的子集. 在大多数其他函数语言中grep调用filter.

如果你只是想在第一场比赛中,使用first列表::的Util.

use List::Util qw/first/;

if (my $result = first {match_test($_)} @list) {
    # use $result for something
} else {
    die "no match\n";
}
Run Code Online (Sandbox Code Playgroud)

  • 此外,当`$ scalar`在`@ array`中时,表达式[`@array ~~ $ scalar`](http://perldoc.perl.org/perlsyn.html#Smart-matching-in-detail)为真. . (6认同)
  • @daxim等人:从5.10.1+开始,~~的顺序很重要.因此它需要是`$ scalar ~~ @ array` NB.为了帮助我把~~作为"in"的同义词. (3认同)

Eth*_*her 6

如果可能有多个匹配:

 my @matches = grep { match_test($_) } @list;
Run Code Online (Sandbox Code Playgroud)

如果只能有一个匹配,则List :: Util的'first'更快(假设找到匹配):

 use List::Util 'first';
 if (my $match = first { match_test($_)} @list)
 {
      # do something with the match...
 }
Run Code Online (Sandbox Code Playgroud)