Конвейерные команды Perl следуют в направлении справа налево от оператора присваивания. Таким образом, вы должны думать назад. Это операция, которая выполняется ближе всего к знаку равенства, что это было сделано первым.
Конечно, теперь для меня это вторая натура, что я редко думаю о том, какими "бэквордами" это может показаться. Однако, если вы сначала выполните grep, а затем сортируете, у вас будет более сжатая сортировка, и, поскольку лучшие сортировки полуквадратичные, уменьшение количества элементов, которые вы собираетесь сортировать, имеет большой смысл.
Поскольку ручки закрываются, когда они выходят из области видимости, вы можете просто сделать это:
my @list
= sort {-M $b <=> -M $a}
grep { !/^\./ && -f "$_"}
<$dir/*>
;
Поскольку для этого вы используете glob , вам не нужно открывать дескриптор каталога. Но если бы вы были, вы можете сделать это так:
my @list = sort ... grep ...
do { opendir( my $dh, $dir ) or die "Cannot open '$dir': $!";
readdir( $dh )
};