私は並べ替える配列の配列を持っている。配列Aの各要素は、3つの要素を持つ配列です。私はPerlで配列の配列をソートしたいが、結果はソートされていない。
my @A = ([2,3,1], [1,2,3], [1,0,2], [3,1,2], [2,2,4]);
Iが昇順にソートしたい: アレイAは次のようになります。 2つの要素を比較すると、最初の数値が使用されます。同数の場合は、2番目の番号が使用され、3番目の番号が使用されます。
ここに私のコードです。私は関数 'cmpfunc'を使って2つの要素を比較します。
sub cmpfunc {
return ($a->[0] <=> $b->[0]) or
($a->[1] <=> $b->[1]) or
($a->[2] <=> $b->[2]);
}
my @B = sort cmpfunc @A;
print "Result:\n";
for my $element (@B) {
print join(",", @{$element}) . "\n";
}
結果:
1,2,3
1,0,2
2,3,1
2,2,4
3,1,2
結果はややソートされますが、正しくありません。私が期待するのは:
1,0,2
1,2,3
2,2,4
2,3,1
3,1,2
比較機能にエラーがありますか? 奇妙なことは、比較コードをブロックに入れると、結果が正しくソートされることです。あなたはそれが "または" 条項のいずれかになる前に戻ります
return ($a->[0] <=> $b->[0])
を実行している
sub cmpfunc {
return (($a->[0] <=> $b->[0]) or
($a->[1] <=> $b->[1]) or
($a->[2] <=> $b->[2]));
}
関連:http://stackoverflow.com/questions/1512547 – mob