我试图通过阅读其文档来了解地图功能无济于事.在它说的文档中"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变换.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           121 次  |  
        
|   最近记录:  |