Как передать параметры в подпрограмму File:: Find, которая обрабатывает каждый файл?
Используя File:: Find, как передать параметры функции, обрабатывающей каждый файл?
У меня есть Perl script, который перемещает каталоги, чтобы конвертировать некоторые 3-канальные файлы TIFF в файлы JPEG (3 файла JPEG в TIFF файл). Это работает, но я хотел бы передать некоторые параметры функции, обрабатывающей каждый файл (не используя глобальные переменные).
Вот соответствующая часть script, где я попытался передать параметр:
use File::Find;
sub findFiles
{
my $IsDryRun2 = ${$_[0]}{anInIsDryRun2};
}
find ( { wanted => \&findFiles, anInIsDryRun2 => $isDryRun }, $startDir);
$isDryRun
является скаляром. $startDir
- это строка, полный путь к каталогу.
$IsDryRun2
не установлен:
Использование неинициализированного значения $IsDryRun2 в конкатенации (.) или строке в TIFFconvert.pl строка 197 (# 1) (W uninitialized) Значение undefined использовалось так, как если бы оно уже было определены. Это было интерпретировано как "" или 0, но, возможно, это была ошибка. Чтобы подавить это предупреждение, назначьте определенное значение вашим переменным.
(Старый вызов без параметров: find ( \&findFiles, $startDir);
)
Тестовая платформа (но производство будет машиной Linux, Ubuntu 9.1, Perl 5.10, 64 бит): ActiveState Perl 64 бит. Windows XP. Из perl -v: v5.10.0, созданного для MSWin32-x64-многопотоковой двоичной сборки 1004 [287188], предоставленной ActiveState.
Ответы
Ответ 1
Вам нужно создать вспомогательную ссылку, которая вызывает ваш желаемый юг с требуемыми параметрами:
find(
sub {
findFiles({ anInIsDryRun2 => $isDryRun });
},
$startDir
);
Это больше или меньше, карри. Это просто некрасиво.:)
Ответ 2
Вы можете создать любой тип ссылки на код, который вам нравится. Вам не нужно использовать ссылку на именованную подпрограмму. Для многих примеров того, как это сделать, см. Мой модуль File:: Find:: Closures. Я создал этот модуль, чтобы ответить именно на этот вопрос.
Ответ 3
Смотрите PerlMonks запись Почему я ненавижу файл:: Find и как я (надеюсь, я) исправил его, описывая, как это сделать с закрытием.