运行以下代码时,将打印C:\ Test下所有文件的文件名。为什么不打印Hello
(n次,具体取决于处理的文件数量)?
这是否意味着我不能依靠shift
可靠地分配给$_
?想象一下,同事实现了wtf
函数,并且不知道它是从File::Find
想要的子调用的。
我使用Strawberry Perl 5.12运行此代码
编辑:此代码也未按预期运行:
use strict;
use warnings;
wanted();
sub wanted{
wtf("Hello");
}
sub wtf {
shift;
print; #expecting Hello
}
所以我想我完全离开这里的高速公路..这显然与File :: Find无关,我现在正在寻找这个问题的新标题。这是我的原始代码:
use strict;
use warnings;
use File::Find;
find(\&wanted, "C:\\test");
sub wanted{
wtf("Hello");
}
sub wtf {
shift;
print; #expecting Hello
}
答案 0 :(得分:4)
print
默认为打印$_
,但shift
默认为转移@_
。如果要获取传递给子例程的参数,则应使用@_
,而不是$_
。 shift
返回移位的值,因此您应该执行以下操作:
sub wtf {
my $_ = shift;
print;
}
问题是您的$_
变量设置为文件名,但@_
设置为参数。 File::Find
{{1}}详细解释了这一点。
答案 1 :(得分:2)
答案 2 :(得分:0)
顺便说一下,在CPAN上有更好的File :: Find替换 - (例如:File :: Find :: Rules或File :: Find :: Object)。 File :: Find实际上是一种来自旧时代的化石,因为它进入了核心。