2016-07-18 10 views
0

私は文字列の配列を持っています。各文字列には、パイプ文字で区切られた複数のフィールドがあります。私は各文字列の最初のフィールドで文字列の逆数値ソートを行いたいと思います。私はうまく動作するいくつかの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

は' <=>をいどんな鐘も鳴らす? –

+0

しかし、比較を行う前に文字列を分割する必要があります。 – Sol

+2

@Sol厳密に言えば、あなたはしません。 '@sorted = reverse sort {$ a <=> $ b} @ unsorted'はいくつかの警告を出すが、あなたが求めた出力を正確に与える。これは、列挙の開始時に数字が検索され、見つかったときに停止するためです。お勧めはしませんが、理解する価値があります! – hobbs

答えて

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 /\|/ ], 
+0

恐ろしい!教育をいただきありがとうございます。うん、あなたのソリューションは間違いなくもっと洗練されています。 – Sol

関連する問題