地图文档不够清晰

时间:2013-09-10 02:04:21

标签: perl

我试图通过阅读其文档来了解地图功能无济于事。 在文档中它说"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

所以基本上,结果将是文件的散列及其文件大小,但我究竟应该仅从文档中了解这一点?

你们能帮助我了解更多吗?

1 个答案:

答案 0 :(得分:10)

实际上,它说

  

映射BLOCK LIST

  评估LIST的每个元素的BLOCK或EXPR(本地设置   $ _到每个元素)并返回由结果组成的列表值   每次这样的评估。在标量上下文中,返回总数   这样生成的元素。在列表上下文中评估BLOCK或EXPR,所以   LIST的每个元素可以产生零个,一个或多个元素   返回值。

重要的是,$_已本地化为BLOCK,包含LIST的每个元素的值。 for循环的情况大致相同,即for (LIST)

-s函数就像你说的文件测试一样,如果没有显式参数,它就会在$_上运行。这与Perl的许多内置函数具有相同的默认行为,例如printunpackordlength

您要显示的代码包含一个标量表达式:[$_, -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