[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

(DTPtechNote:478) perlのsort



perlで任意のフィールドをキーにソートしたいとき、いわゆるシュウォーツ変換をするのが常套手段ですが、これだと(というかsortコマンドそのものが)キーが同じ値の場合、元の配列の順序が壊れてしまいます。

単純な思いつきですが、キーになる(ソート用の)別配列に行番号をふってみました。
こんな方法でよいものかどうか。。。(笑)

@data = (
"C	あああ",
"A	いいい",
"F	ううう",
"B	えええ",
"A	おおお",
"A	かかか",
"E	ききき",
"A	くくく",
"A	けけけ",
"D	こここ");

$cont = 0;
@data_key = map{(split /\t/)[0] . sprintf( "%05d", $cont++ )} @data;#キーだけを含む配列を作成
@sortdata = @data[sort { $data_key[$a] cmp $data_key[$b] } 0 .. $#data_key ];
print join("\n", @sortdata);