地图文档不够清晰

dav*_*vid 0 perl

我试图通过阅读其文档来了解地图功能无济于事.在它说的文档中"Evaluates the BLOCK or EXPR for each element of LIST" 然而,如何知道一个人也可以使用文件测试操作符,如下所示?

map { [$_, -s] } ('perl.c', 'sv.c', 'hv.c', 'av.c');
Run Code Online (Sandbox Code Playgroud)

上述代码的来源是:http://www.stllinux.org/meeting_notes/1997/0918/schwtr.html

所以基本上,结果将是文件的散列以及它的文件大小,但我究竟应该从文档中知道这个怎么样?

你能帮助我了解更多吗?

TLP*_*TLP 10

实际上,它说

地图块列表

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

重要的部分是$_本地化为BLOCK,包含LIST的每个元素的值.for循环也是如此,即for (LIST).

-s函数就像你说的文件测试一样,没有明确的参数$_.这是相同的默认行为,许多Perl的内置函数有,例如print,unpack,ord,length.

您显示的代码包含单个标量表达式:[$_, -s],这是一个数组引用,其中包含文件名$_,如您所说,其大小.

所以,基本上,你在这里看到的是基本的Perl技术.如果有任何事情仍然不清楚,请随意提问.

更新:

至于具体的代码,它可能是Schwartzian变换的一部分,您可以在列表上执行更有效的排序,其中排序条件包含昂贵的操作.例如:

my @files = ('perl.c', 'sv.c', 'hv.c', 'av.c');
my @sorted = sort { -s $a <=> -s $b } @files;     # sorting by file size
Run Code Online (Sandbox Code Playgroud)

对于一个小的列表,这并不重要,但是使用更大的列表,多次运行文件测试可能效率不高,所以我们将测试结果缓存在数组ref中:

my @sorted = map $_->[0],                    # restore original value
             sort { $a->[1] <=> $b->[1] }    # perform sort on element #2
             map { [ $_, -s ] } @files;      # your map statement
Run Code Online (Sandbox Code Playgroud)

然后将其称为Schwartzian变换.

  • 你知道的方法是在手册中查找[文件测试](http://perldoc.perl.org/functions/-X.html).:)"如果省略参数,则测试$ _..." (3认同)