我有一个字符串数组。每个字符串都有一个由管道字符分隔的多个字段。我想通过每个字符串中的第一个字段对字符串进行反向数字排序。我已经编写了一些工作正常的perl代码,我想知道是否有更好的方式来编写它。
sub by_firstField {
my @tmpA = split ( /\|/, $a ) ;
my @tmpB = split ( /\|/, $b ) ;
if ($tmpA[0]> $tmpB[0]) { -1 } elsif ($tmpA[0] < $tmpB[0]) { 1 } else { 0 }
}
push @unsorted, ( "8.02|a|b|c", "47.6|d|e|f", "108.1|g|h|i", "411.5|j|k|l", "8.1|m|n|o" ) ;
@sorted = sort by_firstField @unsorted ;
for ( my $i = 0 ; $i <= $#sorted; $i++ ) {
print $sorted[$i] . "\n" ;
}
而且,这是输出:
411.5|j|k|l
108.1|g|h|i
47.6|d|e|f
8.1|m|n|o
8.02|a|b|c
答案 0 :(得分:3)
sort {
my @fields_a = split /\|/, $a;
my @fields_b = split /\|/, $b;
$fields_b[0] <=> $fields_a[0]
}
或
sort { ( $b =~ /([^|]*)/ )[0] <=> ( $a =~ /([^|]*)/ )[0] }
或
map $_->[0],
sort { $b->[1] <=> $a->[1] }
map [ $_, split /\|/ ],