perl's build in grep
на самом деле очень умный - он выполняет итерацию массива, применяя условие к каждому элементу в свою очередь. Он устанавливает каждый элемент в $_
.
Это условие может быть простым регулярным выражением, но оно не обязательно должно быть.
Таким образом, вы можете - например:
my @files = grep { -f $_ } readir(DIR);
Но поскольку -f
по умолчанию $_
вы также можете:
my @files = grep { -f } readdir (DIR);
Вы также можете применить регулярное выражение для $_
my @files = grep { not m/\.py$/ } readdir (DIR);
(Примечание - это то же самое, что и not $_ =~ m/\.py$/
- шаблоны применяются к $_
по умолчанию).
Так что вы можете делать то, что вы хотите от:
my @files = sort grep { not m/\.py$/ and -f } readdir (DIR);
Хотя примечание - что будет работать в текущем рабочем каталоге, а не для чтения отдельного пути. Вы можете использовать readdir
для разных каталогов, но лично я предпочитаю glob
- потому что он также заполняет путь:
my @files = sort grep { not m/\.py$/ and -f } glob ("$dir/*");