我试图通过阅读其文档来了解地图功能无济于事。
在文档中它说"Evaluates the BLOCK or EXPR for each element of LIST"
但是,如何知道还可以使用文件测试运算符以及如下所示?
map { [$_, -s] } ('perl.c', 'sv.c', 'hv.c', 'av.c');
上述代码的来源是:http://www.stllinux.org/meeting_notes/1997/0918/schwtr.html
所以基本上,结果将是文件的散列及其文件大小,但我究竟应该仅从文档中了解这一点?
你们能帮助我了解更多吗?
答案 0 :(得分:10)
实际上,它说
映射BLOCK LIST
评估LIST的每个元素的BLOCK或EXPR(本地设置 $ _到每个元素)并返回由结果组成的列表值 每次这样的评估。在标量上下文中,返回总数 这样生成的元素。在列表上下文中评估BLOCK或EXPR,所以 LIST的每个元素可以产生零个,一个或多个元素 返回值。
重要的是,$_
已本地化为BLOCK,包含LIST的每个元素的值。 for
循环的情况大致相同,即for (LIST)
。
-s
函数就像你说的文件测试一样,如果没有显式参数,它就会在$_
上运行。这与Perl的许多内置函数具有相同的默认行为,例如print
,unpack
,ord
,length
。
您要显示的代码包含一个标量表达式:[$_, -s]
,它是一个数组引用,包含$_
内的文件名,正如您所说,它的大小。
所以,基本上,你在这里看到的是基本的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 transform。