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; だと数値を降順にソートします。
| 固定リンク
「Perl」カテゴリの記事
- ホームページからファイルをダウンロードさせる方法(2005.02.10)
- サーバにファイルをアップロードする方法(2005.02.10)
- Perlで2次配列をソート関数でソートする(2005.01.24)
- Perlでソート関数を使う(2005.01.23)
コメント