Этот алгоритм довольно эффективен, потому что он останавливается на первом элементе, но вы можете попробовать List::Util::first
.
use List::Util qw<first>;
#...
return defined first { -e && -d } @$param;
Единственной серьезной оптимизацией было бы то, что она работает на C-слое.Это также довольно узнаваемая идиома в Perl, и поэтому, несмотря на внешний вид гольфа, цель состоит в том, чтобы «говорить на Perl», а не в гольфе.
List::MoreUtils::any
даст вам аналогичный эффект, а также он лучше соответствует тому, что вы пытаетесь выразить: вы спрашиваете, являются ли какие-либо в массиве каталогами.(хотя подсказка, что передача параметров стека происходит немного быстрее, чем создание ссылки и ее передача - по крайней мере, в моих тестах.)
В любом случае, вот как это выглядит:1016 * Означает возвращение true, если оно удовлетворяет этому выражению.any
часто выполняется на уровне C, если модуль может загрузить свою версию XS.В противном случае это «Pure Perl» и, вероятно, работает аналогично вашему.
Тем не менее, я уверен, что вам не нужно проверять наличие и каталог.Я уверен, что если файл не существует, он не будет рассматриваться как каталог.Таким образом, вы можете свернуть его до одного состояния.