Внутри grep
, $_
относится к элементу списка, участвующему в тесте.Кроме того, /abc/
является сокращением от $_ =~ /abc/
, поэтому вы эффективно тестируете $_ =~ /$_/
угадайте, каким будет ответ (без метасимволов)?
Итак, вы передаете все значения в @regression_links
.
Что вам нужно сделать, это сохранить значение $_
.Но так как вы не используете простой оператор print
, вы можете так же легко зарезервировать переменную $_
для grep, например:
foreach my $reg ( @regressions ) {
print "$reg\n";
@regression_links = grep(/$reg/, @current_test_summary_file );
}
Однако вы сбрасываете @regression_links
с каждым циклом, и push
будет работать лучше:
push @regression_links, grep(/$reg/, @current_test_summary_file );
Однако цикл for
в любом случае является плохим выбором, поскольку вы можете получить дубликаты, а вы можете их не захотеть.Поскольку вы сопоставляете по регулярному выражению, одна альтернатива с несколькими критериями состоит в создании чередования регулярных выражений.Но чтобы получить правильное чередование, нам нужно отсортировать его по длине строки по убыванию, а затем по алфавиту (cmp
).
# create the alternation expression
my $filter
= join( '|'
, sort { length( $b ) <=> length( $a )
|| $a cmp $b
}
@regressions
);
@regression_links = grep( /$filter/, @current_test_summary_file );
Или, помимо объединения регулярных выражений, если вы хотите проверить их по отдельности, лучше использовать что-то вроде List::MoreUtils::any
:
@regression_links
= grep {
my $c = $_; # save $_
return any { /$c/ } @regressions;
} @current_test_summary_file
;