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

Geo*_*Geo 0 perl types

在这个片段中:

find( sub { 
        print "found " . $File::Find::name . "\n";
     }, ("."));
Run Code Online (Sandbox Code Playgroud)

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

Eth*_*her 7

我们来看看参数File::Find::find.文件说:

find(\&wanted, @directories_to_search);
Run Code Online (Sandbox Code Playgroud)

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

sub find
{
    my ($wanted, @directories_to_search) = @_;
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

因此,当您指定@_($wanted, @directories_to_search),所有剩余的参数都分配给@directories_to_search(一组标量).

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

  1. 匿名coderef sub { ... }
  2. ".":一个长度为一个字符的字符串.

就像这样:

my ($wanted, @directories_to_search) = (sub { ... }, ".");
Run Code Online (Sandbox Code Playgroud)

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

my $wanted = sub { ... };
my @directories_to_search = ".";
Run Code Online (Sandbox Code Playgroud)

我不太确定你为什么问这个问题(这个(".")术语是什么类型),但你可以find()像上面写的一样打电话,或者你可以删除额外的括号(它们不添加任何东西) ).