とあるエンジニアの闇歴史帳

コピペで使える便利Wiki ※現在構築中です。

ユーザ用ツール


perl:array_sort_number

差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

perl:array_sort_number [2017/12/14 20:18]
perl:array_sort_number [2020/06/23 14:10] (現在)
行 1: 行 1:
 +====== 数値の値でソートする - Perl ======
 +~~socialite~~
 +<note important>この記事は2006年10月02日に書かれたものです。</note>
 +
 +===== 解説 =====
 +
 +以下のようなコードを書くと、文字列として扱われてしまい、意図した結果にならない場合がある。
 +
 +<code perl>
 +@array = ( 1, 2, 3, 4, 5, 10, 11, 12 );
 +foreach(sort @array){
 +  print ;
 +  print "\n"
 +}
 +<code>
 +
 +この実行結果は以下になる。
 +<code>
 +1
 +10
 +11
 +12
 +2
 +3
 +4
 +5
 +</code>
 +
 +これを回避するコードは次のようなものである。
 +
 +===== サンプル =====
 +<code perl>
 +@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"
 +}
 +</code>
 +
 +===== 実行結果 =====
 +<code>
 +1
 +2
 +3
 +4
 +5
 +10
 +11
 +12
 +
 +12
 +11
 +10
 +5
 +4
 +3
 +2
 +1
 +</code>
 +
 +昇順と降順は、$a,$bの位置を変更するだけである。
 +ちなみに、$a, $bは my などをつけなくても、Perl上ですでに定義されているため、use strictした環境でもエラーにはならない。
 +
 +
 +なお、文字列して比較したい場合には <=>をcmpに置き換える。
 +<code perl>
 +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"
 +}
 +</code>
 +<code>
 +1
 +10
 +11
 +12
 +2
 +3
 +4
 +5
 +
 +5
 +4
 +3
 +2
 +12
 +11
 +10
 +1
 +</code>
 +===== 関連書籍 =====
 +{{amazon>jp:4873113148}}
 +<html><p style="clear:both"></p></html>
 +
 +{{amazon>jp:4798139815}}
 +<html><p style="clear:both"></p></html>
 +
 +{{tag>CGI・Perl例文集 Perl 配列 リスト ソート sort}}
 +~~socialite~~
  

関連ページ