以下のようなコードを書くと、文字列として扱われてしまい、意図した結果にならない場合がある。
@array = ( 1, 2, 3, 4, 5, 10, 11, 12 ); foreach(sort @array){ print ; print "\n" }
この実行結果は以下になる。
1 10 11 12 2 3 4 5
これを回避するコードは次のようなものである。
サンプル
@array = ( 1, 2, 3, 4, 5, 10, 11, 12 ); #-- 昇順 --# foreach(sort {$a <=> $b} @array){ print ; print "\n" } #-- 降順 --# foreach(sort {$b <=> $a} @array){ print ; print "\n" }
実行結果
1 2 3 4 5 10 11 12 12 11 10 5 4 3 2 1
昇順と降順は、$a,$bの位置を変更するだけである。 ちなみに、$a, $bは my などをつけなくても、Perl上ですでに定義されているため、use strictした環境でもエラーにはならない。
なお、文字列して比較したい場合には <=>
をcmp
に置き換える。
use strict; my @array = ( 1, 2, 3, 4, 5, 10, 11, 12 ); foreach(sort {$a cmp $b} @array){ print ; print "\n" } print "\n"; foreach(sort {$b cmp $a} @array){ print ; print "\n" }
1 10 11 12 2 3 4 5 5 4 3 2 12 11 10 1