« 二次元ハッシュを作成する (Perl) | メイン | 配列,リストからある条件と一致した値を取出す (Perl, grep) »

カテゴリー:ソート(並べ替え) リスト(配列) 

数値の値でソートする (Perl, sort)

このエントリーを含むはてなブックマーク  livedoorクリップ  数値の値でソートする (Perl, sort)をdel.icio.usに追加  数値の値でソートする (Perl, sort)をYahoo!ブックマークに追加  数値の値でソートする (Perl, sort)をニフティクリップに追加

以下のようなコードを書くと、文字列として扱われてしまい、意図した結果にならない場合がある。

@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"
}

__END__
○実行結果
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"
}

__END__
○実行結果
1
10
11
12
2
3
4
5

5
4
3
2
12
11
10
1




トラックバック

このエントリーのトラックバックURL:
http://katsubemakito.net/mt/mt-tb.cgi/318






クリエイティブ・コモンズ・ライセンス
このブログは、次のライセンスで保護されています。 クリエイティブ・コモンズ・ライセンス.