File::Find
和 wanted
子程序
这个问题比原来的标题(“子程序的原型和前向声明”!)要简单得多。我希望答案,无论多么简单,都能帮助我理解子例程/函数、原型和范围以及File::Find
模块。
使用 Perl,子程序几乎可以出现在任何地方,您通常不需要进行前向声明(除非子程序声明了一个原型,我不确定如何在 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;
or 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()
非常感谢任何加深(和加快)我对此理解的帮助。
编辑:这是我使用输出创建的Stack Overflow 上最近的示例脚本。find2perl
如果你从中删除sub
,sub wanted;
你应该得到同样的错误。
编辑:正如我在下面的评论中指出的(但我也会在这里标记它):几个月来我一直在使用Path::Iterator::Rule
而不是File::Find
. 它需要perl >5.10
,但我永远不必在奇怪的“从不升级”的站点上部署生产代码,5.8.*
只有策略,所以Path::Iterator::Rule
它已成为我永远不想放弃的那些模块之一。也有用的是Path::Class
。干杯。