Perv中的Schwartzian变换?

时间:2011-06-26 10:51:49

标签: perl

my @output =
map $_->[0],
sort{$a->[1] <=> $b->[1]}
map [$_,-s $_],     
@array;   

有人可以更详细地解释一下代码吗?我不能得到它的头部或尾部..

2 个答案:

答案 0 :(得分:10)

自下而上阅读:

@array

一个数组(文件名,稍后使用)。

map [$_,-s $_],

对于每个文件名,获取对两元素匿名数组的引用,第一个元素是文件名,第二个元素是文件的字节大小。 map返回这些数组引用的列表。

sort{$a->[1] <=> $b->[1]}

通过增加文件大小对数组引用列表进行排序。

map $_->[0],

将数组引用列表转回文件名列表,但现在按排序顺序。

my @output =

将列表保存在@output中。

这相当于以下功能:

my @output = sort { -s $a <=> -s $b } @array;

但只能获得每个文件的大小一次,而不是按排序进行每次比较一次。

答案 1 :(得分:4)

维基百科有一个详细的explanation and analysis