Найти элемент в массиве, который соответствует определенным критериям, если таковой имеется (Perl)? - PullRequest
4 голосов
/ 21 июня 2010

Существует ли идиома Perl для поиска элемента в массиве, который соответствует определенным критериям, если таковой имеется?

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

Пример кажется немного неуклюжим. Я ожидаю, что у Perl будет что-то, чтобы справиться с этим более чисто.

Ответы [ 2 ]

14 голосов
/ 21 июня 2010

Да, grep - это то, что вы ищете:

my @results = grep {match_test($_)} @list;

grep возвращает подмножество @list, где match_test вернул true.grep называется filter в большинстве других функциональных языков.

, если вы хотите только первое совпадение, используйте first из List :: Util .

use List::Util qw/first/;

if (my $result = first {match_test($_)} @list) {
    # use $result for something
} else {
    die "no match\n";
}
6 голосов
/ 21 июня 2010

Если может быть несколько совпадений:

 my @matches = grep { match_test($_) } @list;

Если совпадение может быть только одно, List :: Util 'first' быстрее (при условии, что совпадение найдено):

 use List::Util 'first';
 if (my $match = first { match_test($_)} @list)
 {
      # do something with the match...
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...