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 functionfunction()
非常感谢任何加深(和加快)我对此理解的帮助。
编辑:这是我使用输出创建的Stack Overflow 上最近的示例脚本。find2perl如果你从中删除sub ,sub wanted;你应该得到同样的错误。
编辑:正如我在下面的评论中指出的(但我也会在这里标记它):几个月来我一直在使用Path::Iterator::Rule而不是File::Find. 它需要perl >5.10,但我永远不必在奇怪的“从不升级”的站点上部署生产代码,5.8.*只有策略,所以Path::Iterator::Rule它已成为我永远不想放弃的那些模块之一。也有用的是Path::Class。干杯。