File :: Find和嵌套子例程中的$ _

时间:2010-06-02 09:19:14

标签: perl find arguments implicit subroutine

运行以下代码时,将打印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 
}

3 个答案:

答案 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实际上是一种来自旧时代的化石,因为它进入了核心。