Есть ли для perl'а какая-либо реализация логики grep, при которой если grep проверяется в булевом контексте, то первое же совпадение приведёт к завершению перебора входного списка?
Просто косячить эту логику циклом for - как-то некошерно, да и короткая форма работает уродливо:
my $f;
my %hsh=('a'..'z');
my $arr=[qw/b c d/]
exists $hsh{$_} and $f=$_, last for @{$arr};
Делать из $arr сначала временный хеш, а потом по нему искать пересечения с %hsh - тоже как-то криво (мягко скажем).
Идеальным был бы вариант:
perl -E 'print "hello\n" if grep { say; $_&1 } 1..31'
Но он печатает всё от 1 до 31, хотя уже первого элемента списка достаточно для true в if'е. Как известно, в grep не работают никакие last'ы, break'и, next'ы. Возможно, есть уже некий кусок XS'ки, исправляющий эту досадную недоработку? Если уж в этом случае grep зачем-то перебирает всё подряд, то чего бы тогда в and и or не вычислять всегда левую и правую части выражения, просто «шоб було»?
Запостил этот вопрос на SO: https://stackoverflow.com/questions/47416807/avoid-grepping-all-in-boolean-co...