Поиск файлов с помощью Perl

File::Find и wanted подпрограмма

Этот вопрос намного проще, чем оригинальное название ("прототипы и предварительная декларация подпрограмм »!) давай дальше. Я'Я надеюсь, что ответ, пусть и простой, поможет мне понять подпрограммы / функции, прототипы и область видимости, а такжеFile::Find модуль.

С Perl подпрограммы могут появляться практически везде, и вы обычно нене нужно делать предварительные объявления (кроме случаев, когда sub объявляет прототип, который яЯ не уверен, как это сделать в "стандарт» кстати в Perl). Что я обычно делаю с Perl?Небольшая разница между этими разными способами бега:somefunction

sub somefunction;  # Forward declares the function
&somefunction; 
somefunction();
somefunction;   # Bare word warning under `strict subs`

Я часто используюfind2perl генерировать код, который я взламываю / взламываю на части скриптов. Это может быть плохим стилем, и теперь мое грязное белье публично, но так и будет :-) ДляFile::Find wanted функция является обязательной подпрограммой -find2perl создает его и добавляетsub wanted; в результирующий скрипт он создает. Иногда, когда я редактирую сценарий, яудалим ""sub отsub wanted и это заканчивается как&wanted; или жеwanted();, Но безsub wanted; Форма форвардной декларации я получаю это предупреждение:

Use of uninitialized value $_ in lstat at findscript.pl line 29

Мой вопрос: почему это происходит, и это настоящая проблема? Это "просто предупреждение, но я хочу понять это лучше.

Документация и код говорят$_ локализован внутриsub wanted {}, Почему это будет неопределенным, если я используюwanted(); вместо ?sub wanted;Являетсяwanted где-то используете прототипы? Я что-то упускаю из виду?Find/File.pmЭто потому чтоwanted возвращает ссылку на код? (???)

Я предполагаю, что форма декларации "инициализирует» wanted таким образом, чтобы первое использование нене может быть пустой переменной по умолчанию. Я предполагаю, что именно так будут работать прототипы - даже прототипы Perl, такие как они существуют. Я попытался просмотреть исходный код Perl, чтобы понять, чтоsub делает, когда функция вызывается с помощьюsub function вместоfunction(), но это может быть за мной в данный момент.

Любая помощь, углубляющая (и ускоряющая) мое понимание этого, высоко ценится.

РЕДАКТИРОВАТЬ: Вот'снедавний пример скрипта здесь на стекеперелив что я создал с помощью 'find2perlвыходной. Если вы удалитеsub отsub wanted; Вы должны получить ту же ошибку.

РЕДАКТИРОВАТЬ: Как я отметил в комментарии ниже (но яЯ тоже буду отмечать это здесь): в течение нескольких месяцев ямы использовалиPath::Iterator::Rule вместоFile::Find, Это требуетperl >5.10, но мне никогда не придется развертывать производственный код на сайтах с нечетным "никогда не обновляйся ",5.8.* только политики такPath::Iterator::Rule стал одним из тех модулей, которые я никогда не хочу делать с. Также полезноPath::Class, Приветствия.

Ответы на вопрос(3)

Ваш ответ на вопрос