在这个片段中:
find( sub {
print "found " . $File::Find::name . "\n";
}, ("."));
Run Code Online (Sandbox Code Playgroud)
会(".")是什么类型的?数组还是标量?
我们来看看参数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()通过传递包含两个术语的列表来调用:
sub { ... }".":一个长度为一个字符的字符串.就像这样:
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()像上面写的一样打电话,或者你可以删除额外的括号(它们不添加任何东西) ).