Поиск файлов с помощью 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
, Приветствия.