-->
原文参见:http://www.stonehenge.com/merlyn/UnixReview/col06.html
数据:
Fred 210
Barney 195
Betty 200
Wilma 170
Dino 30
第一列是姓名,第二列为分数,我们需要按照分数进行排序;
通常的做法:
#!/usr/bin/perl -w
use strict;
my @data=<>;
my %scores;
foreach (@data){
my ($name,$score)=split;
$scores{$_}=$score;
}
print sort { $scores{$a} <=> $scores{$b}; } @data;
下面这样的排序挺有意思的:
#!/usr/bin/perl
use strict;
my @data=<>;
print map{$_->[0]} sort {$a->[1] <=> $b->[1];} map {my ($name,$score)=split;[$_,$score];} @data;
这样看着有些乱,改成这样:
#!/usr/bin/perl
use strict;
my @data=<>;
print map{$_->[0]}
sort {$a->[1] <=> $b->[1];}
map {my ($name,$score)=split;[$_,$score];} @data;
首先 map {my ($name,$score)=split;[$_,$score];} @data生成一个数组,每个元素都是一个指向一个包含两个元素的数组的引用,将这个数组传递给sort产生排序后的数组,然后将生成的数组传递给map得到最终的结果。

发表评论