【问题标题】:File::Find and $_ in nested subroutines嵌套子例程中的 File::Find 和 $_
【发布时间】:2010-06-02 09:19:13
【问题描述】:

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

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

【问题讨论】:

  • 试试 perldoc -f shift - 是什么让你认为 shift 分配给 $_?
  • 我不知道。我只是想到了这两条线:换档;打印;

标签: perl find arguments implicit subroutine


【解决方案1】:

print 默认打印$_,但shift 默认转换@_。如果你想将参数传递给子程序,你应该使用@_,而不是$_shift 返回移位后的值,所以你应该这样做:

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

问题是您的$_ 变量设置为文件名,但@_ 设置为参数。 File::FindCPAN documentation 对此进行了详细说明。

【讨论】:

  • 没什么大不了的。 Perl 只是令人困惑。
【解决方案2】:

【讨论】:

  • 查看我对 jasonmp85 答案的评论。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多