3

运行以下代码时,将打印 C:\Test 下面所有文件的文件名。为什么它不只打印Hello(n 次,取决于处理了多少文件)?

这是否意味着我不能依靠shift可靠地分配给$_?想象一下,一个同事实现了这个wtf函数,但不知道它是从一个File::Find 想要的sub 调用的。我用 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 
}
4

3 回答 3

4

print默认为打印$_,但shift默认为移位@_。如果您想将参数传递给子例程,您应该使用@_,而不是$_shift返回移位后的值,因此您应该执行以下操作:

sub wtf {
    my $_ = shift;
    print;
}

问题是您的$_变量设置为文件名,但@_设置为参数。CPAN 文档详细解释了这File::Find一点。

于 2010-06-02T09:45:40.033 回答
2

shift不分配给$_

于 2010-06-02T09:43:30.273 回答
0

顺便说一句,在 CPAN 上有更好的 File::Find 替代品 - (例如:File::Find::Rules 或 File::Find::Object)。File::Find 真的是一种古老的化石,被它进入核心的事实吓坏了。

于 2010-06-02T16:58:27.377 回答