To File :: Find这是一个数组还是一个标量?

时间:2009-10-24 20:34:01

标签: perl types

在此片段中:

find( sub { 
        print "found " . $File::Find::name . "\n";
     }, ("."));

(".")会是什么类型?数组还是标量?

2 个答案:

答案 0 :(得分:7)

我们来看看File::Find::find的参数。文档说:

find(\&wanted, @directories_to_search);

让我们想一下这样写的find()函数:

sub find
{
    my ($wanted, @directories_to_search) = @_;
    ...
}

你需要意识到的是传递给函数的参数已经在列表上下文(标量列表)中:这是特殊变量@_。因此,当您调用find()时,第一个参数将分配给$wanted,视为coderef(引用只是一种标量)。分配给的下一个变量是一个数组。将列表分配给数组时,该数组是“贪婪的”并从列表中获取所有值。

因此,当您将@_分配给($wanted, @directories_to_search)时,所有剩余的参数都会分配给@directories_to_search(一组标量)。

现在让我们回到你的代码。在最高级别,您通过传递包含两个术语的列表来调用find()

  1. 匿名coderef sub { ... }
  2. ".":一个长度为一个字符的字符串。
  3. 就是这样:

    my ($wanted, @directories_to_search) = (sub { ... }, ".");
    

    所以find()接收上面描述的那些参数:匿名coderef是第一个参数,@directories_to_search吞噬其余参数:

    my $wanted = sub { ... };
    my @directories_to_search = ".";
    

    我不确定你为什么要问这个问题((".")这个词是什么类型),但你可以像上面写的那样打电话给find(),或者你可以删除额外的括号(它们不添加任何内容)。

答案 1 :(得分:1)

阅读MJD on context