在此片段中:
find( sub {
print "found " . $File::Find::name . "\n";
}, ("."));
(".")
会是什么类型?数组还是标量?
答案 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()
:
sub { ... }
"."
:一个长度为一个字符的字符串。就是这样:
my ($wanted, @directories_to_search) = (sub { ... }, ".");
所以find()
接收上面描述的那些参数:匿名coderef是第一个参数,@directories_to_search
吞噬其余参数:
my $wanted = sub { ... };
my @directories_to_search = ".";
我不确定你为什么要问这个问题((".")
这个词是什么类型),但你可以像上面写的那样打电话给find()
,或者你可以删除额外的括号(它们不添加任何内容)。
答案 1 :(得分:1)