Подтвердить что ты не робот

Как передать параметры в подпрограмму 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.

4b9b3361

Ответ 1

Вам нужно создать вспомогательную ссылку, которая вызывает ваш желаемый юг с требуемыми параметрами:

find( 
  sub { 
    findFiles({ anInIsDryRun2 => $isDryRun });
  },
  $startDir
);

Это больше или меньше, карри. Это просто некрасиво.:)

Ответ 2

Вы можете создать любой тип ссылки на код, который вам нравится. Вам не нужно использовать ссылку на именованную подпрограмму. Для многих примеров того, как это сделать, см. Мой модуль File:: Find:: Closures. Я создал этот модуль, чтобы ответить именно на этот вопрос.