实际上,它说
地图块列表
评估 LIST 的每个元素的 BLOCK 或 EXPR(本地设置 $_ 到每个元素)并返回由每个此类评估的结果组成的列表值。在标量上下文中,返回如此生成的元素总数。在列表上下文中计算 BLOCK 或 EXPR,因此 LIST 的每个元素都可以在返回值中产生零个、一个或多个元素。
重要的部分是$_
本地化到 BLOCK,包含 LIST 的每个元素的值。循环也是如此for
,即for (LIST)
.
正如您所说,该-s
函数是一个文件测试,并且没有明确的参数,它在$_
. 这与许多 Perl 的内置函数所具有的默认行为相同,例如print
, unpack
, ord
, length
。
您显示的代码包含一个标量表达式:[$_, -s]
,它是一个数组 ref,其中包含文件名$_
,正如您所说,它的大小。
所以,基本上,您在这里看到的是基本的 Perl 技术。如果还有什么不明白的,欢迎追问。
更新:
至于这段代码的具体作用,它可能是Schwartzian transform的一部分,您可以在其中对列表执行更有效的排序,其中排序标准由昂贵的操作组成。例如:
my @files = ('perl.c', 'sv.c', 'hv.c', 'av.c');
my @sorted = sort { -s $a <=> -s $b } @files; # sorting by file size
对于小列表,这无关紧要,但是对于较大的列表,多次运行文件测试可能效率不高,因此我们将测试结果缓存在数组 ref 中:
my @sorted = map $_->[0], # restore original value
sort { $a->[1] <=> $b->[1] } # perform sort on element #2
map { [ $_, -s ] } @files; # your map statement
这被称为Schwartzian 变换。