« LunascapeでSUNのJavaを使う方法 | トップページ | Perlで2次配列をソート関数でソートする »

2005/01/23

Perlでソート関数を使う

Perlには sort という便利な関数があります。
配列(リスト)を、順番に並べてくれます。
書式は、一般的な関数とは違っていて、ちょっとややこしいです。

1、  @list_b = sort subname @list_a;
2、  @list_b = sort { $a <=> $b } @list_a;
の2つあります。

1の例だと、
@list_b = sort subsort @list_a;
sub subsort {
  return $a <=> $b;
}
という書き方になります。
subsortというのはサブルーチン名で、&subsort( ) と書かないところがややこしいところです。
$a、$bというのは、@list_aの要素のうちの2つの参照です。変数名は必ず $a 、 $b になります。
サブルーチン subsortは、同じパッケージ内に無いといけません。
return で返される値は、-1、0、1 のいずれかになります。
-1が返ると $a が前に、0だとそのまま、1だと $b が前に並べ替えられます。
つまり、サブルーチンの中は、-1か0か1を返せるようになっていれば良いわけです。

ってな感じで、一般的なPerlの法則とはちょっと違ったルールが適用されています。
ちなみに $x <=> $yの <=> 演算子は、$x が $y より小さい場合は -1、等しい場合は 0、$x が $y より大きい場合は 1 を返します。
文字列の場合は、 $x cmp $y と書けば、同じく 小さいか、同じか、大きいかによって -1、0、1 のどれかが返って来ます。

私が良く使う例として、
@list_b = sort subsort @list_a;
sub subsort {
  if ( length( $a ) < 1 and length( $b ) > 0 ) {
    return -1;
  } elsif ( length( $a ) > 0 and length( $b ) < 1 ) {
    return 1;
  } elsif ( length( $a ) < 1 and length( $a ) < 1 ) {
    return 0;
  }
  return $a cmp $b
}
ってなのがあります。
これは文字列を、空白文字を一番最後に、昇順にソートします。

これが理解できれば、
2の例も似たようなものだというのが解ると思います。
サブルーチンにしているのか、ブロックにしているのか、という違いだけです。
簡単な比較ならブロックで済むし、複雑なソート条件があるなら、サブルーチンにして処理できます。
@list_b = sort { $a <=> $b } @list_a; だと数値を昇順にソートし、
@list_b = sort { $b <=> $a } @list_a; だと数値を降順にソートします。

|

« LunascapeでSUNのJavaを使う方法 | トップページ | Perlで2次配列をソート関数でソートする »

Perl」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/54336/2674045

この記事へのトラックバック一覧です: Perlでソート関数を使う:

« LunascapeでSUNのJavaを使う方法 | トップページ | Perlで2次配列をソート関数でソートする »