请教:单字母到多字母排序

请教:单字母到多字母排序

请教:单字母到多字母排序
in.txt为:
AB 2 10%
BCD 4 20%
A 2 10%
B 3 15%
BC 2 10%
ABC 7 35%
期望out.txt为:
A 2 10%
B 3 15%
AB 2 10%
BC 2 10%
BCD 4 20%
ABC 7 35%

空格为Tab.
排序标准:
1.第一字段单字母到多字母
2.第二字段数字从小到大.




   

%a = (-- ...
%a = (
'ABC' => 7,
'AB' => 2,
'BCD' => 4,
'A' => 2,
'B' => 3,
'BC' => 2,
);

@b = sort { length($a) <=> length($b) || $a{$a} <=> $a{$b} || $a cmp $b } keys %a;

print "$_ => $a{$_}\n" foreach (@b);

第一比较他们的长度,如果长度一样比较他们的值(第二项的大小)
如果值还是一样(类如这里的AB,BC,他们长度一样值一样),那就比较他们本身的字母大小。

Enjoy!
[CCB]13[/CCB]...
[CCB]13[/CCB]
多谢fayland! 多谢fayland!
open FH,"in.txt";
@c=<FH>;
push (@d,split/\t/,$_),foreach @c;
%a=@d;
这样可以解决文本输入.
但第三字段的百分比是有有效信息啊.hash如何解决?

分享:二维数组可以解决如下(源于chinaunix的pupilzeng):
#!/usr/bin/perl -w

open FH,"in.txt";
my @lines = ();
while(<FH>){
chomp;
my @a = split /\t/, $_;
push @lines, [@a];
}
@lines = sort {length($a->[0]) <=> length($b->[0])
||
$a->[1] <=> $b->[1]} @lines;
print $_->[0],"\t", $_->[1],"\t", $_->[2], "\n" foreach(@lines);
close FH;