Если вы хотите отфильтровать подкаталоги, возвращаемые с помощью File :: Find, вы должны использовать функцию предварительной обработки (а не переменную $ File :: Find :: prune), поскольку это дает вам гораздо больший контроль.Идея состоит в том, чтобы предоставить функцию, которая вызывается один раз для каждого каталога и передается список файлов и подкаталогов;возвращаемое значение - отфильтрованный список для передачи в требуемую функцию и (для подкаталогов) для рекурсии.
Как прокомментировали msw и Брайан, ваш пример, вероятно, будет лучше обслуживаться глобусом, но еслихотел использовать File :: Find, вы можете сделать что-то вроде следующего.Здесь функция предварительной обработки вызывает -f для каждого заданного файла или каталога, возвращая список файлов.Затем требуемая функция вызывается только для этих файлов, и File :: Find не попадает ни в один из подкаталогов:
use strict;
use File::Find;
# Function is called once per directory, with a list of files and
# subdirectories; the return value is the filtered list to pass to
# the wanted function.
sub preprocess { return grep { -f } @_; }
# Function is called once per file or subdirectory.
sub wanted { print "$File::Find::name\n" if /\.cue$/; }
# Find files in or below the current directory.
find { preprocess => \&preprocess, wanted => \&wanted }, '.';
. Это можно использовать для создания гораздо более сложных средств поиска файлов.Например, я хотел найти все файлы в каталоге проекта Java, не возвращаясь в подкаталоги, начинающиеся с «.», Такие как «.idea» и «.svn», созданные IntelliJ и Subversion.Вы можете сделать это, изменив функцию предварительной обработки:
# Function is called once per directory, with a list of files and
# subdirectories; return value is the filtered list to pass to the
# wanted function.
sub preprocess { return grep { -f or (-d and /^[^.]/) } @_; }