Как я передаю параметры подпрограмме File::Find, которая обрабатывает каждый файл?

Используя File::Find, как я могу передать параметры функции, которая обрабатывает каждый файл?

У меня есть сценарий Perl, который пересекает каталоги для преобразования некоторых файлов TIFF с 3 каналами в файлы JPEG (3 файла JPEG на файл TIFF). Это работает, но я хотел бы передать некоторые параметры функции, которая обрабатывает каждый файл (за исключением использования глобальных переменных).

Вот соответствующая часть сценария, где я попытался передать параметр:

use File::Find;

sub findFiles
{
    my $IsDryRun2 = ${$_[0]}{anInIsDryRun2};
}

find ( { wanted => \&findFiles, anInIsDryRun2 => $isDryRun }, $startDir);

$isDryRun скаляр. $startDir строка, полный путь к каталогу.

$IsDryRun2 не установлен:

Использование неинициализированного $IsDryRun2 значения в конкатенации (.) или строке в строке TIFFconvert.pl 197 (#1) (W неинициализированный) неопределенное значение использовалось, как будто это было уже определено. Это интерпретировалось как "" или 0, но возможно это была ошибка. Для подавления этого предупреждения присваивают определенное значение переменным.

(Старый вызов без параметров был: find ( \&findFiles, $startDir); )


Тестовая платформа (но производство домой будет машина Linux, Ubuntu 9.1, Perl 5.10, 64 бита): ActiveState Perl 64 бита. Windows XP. От жемчуга-v: v5.10.0, созданный для MSWin32-x64-multi-thread Двоичной сборки 1004 [287188] обеспеченный ActiveState.

13
задан Peter Mortensen 6 November 2011 в 23:08
поделиться

2 ответа

См. следующий поток:

Это означает, что вы изменили класс во время отладки приложения и не смогли обновить класс для приложения во время его работы.
Эта ошибка предполагает, что может быть запущен более старый JVM, т.е. до 1.4.2, но эта ошибка может произойти с любым JVM, если изменение несовместимо с предыдущей версией класса.

Тщательно проверьте, какой JRE используется в сеансе отладки.

Также проверьте развертывание классов, скомпилированных с набором атрибутов отладки. (см. этот поток )

Наконец, как указано в :

вы отключили функцию « Project- > Автоматическое построение »?
Горячая замена кода работает (только?), если включена автоматическая сборка...

http://www.webreference.com/programming/javascript/rg7/Build-Automatically.gif

-121--1210901-

Я сталкивался с подобными ситуациями в прошлом, хотя мои причины для оптимизации были для SEO. Для меня это зависит от того, что вы делаете с переменными URL страницы, они добавляются на всех/большинстве страниц? Если они для меня, то почти всегда есть гораздо лучший способ, хотя если вы далеко по пути развития, то, вероятно, уже поздно.

Мне нравится иметь возможность «читать» URL, особенно когда я попадаю в неизвестный сайт 2 или более слоев глубоко в навигации, и там сайт разработан плохо, это часто самый простой и быстрый способ для продвинутого пользователя найти, где они находятся на сайте.

Если вы заинтересованы в этом с точки зрения SEO, обычно лучше иметь иерархию, которая содержит только :/- _ Поисковые системы попытаются прочитать URL, смотрите это видео Мэтта Каттса (не могу вспомнить, как далеко в видео он упоминает его, но это все равно хорошие часы...)

-121--4950915-

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

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

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

15
ответ дан 1 December 2019 в 22:39
поделиться

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

3
ответ дан 1 December 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: