- 締切済み
Perlの文字列ソートについて
こんにちわ。 例えば、 あいう,2002/04/12, ななな,2002/04/14, あいう,2002/04/20, というlogがあったとして、これを表示させるときには、 あいう 2002/04/12 あいう 2002/04/20 ななな 2002/04/14 といった具合に出力させたいのですが、そのsortのさせ方がわかりません。 my @lines = sort by_no(@lines); sub by_no { my $no1 = (split(/,/,$a))[0]; my $no2 = (split(/,/,$b))[0]; $no2 cmp $no1; } ではどこがいけないのでしょうか? 教えてください。お願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- leaz024
- ベストアンサー率75% (398/526)
> ではどこがいけないのでしょうか? ということですが、どのようにダメなのでしょうか? コピーして確認したところ、単に逆順にソートされてしまうだけのようです。 文字列を昇順(あいうえお順)にソートしたい場合、 $no2 cmp $no1; ではなく、 $no1 cmp $no2; とします。 ちょっと気になった部分として、 > my @lines = sort by_no(@lines); のところですが、既存の配列 @lines を、ここで my 宣言するのはどうかな、と思います。 正しく動作するようですが、下記のようにした方がよいと思います。 ・元の配列の内容は不要 → my 宣言しない(@lines を書き換える) ・元の配列の内容も必要 → my 宣言する配列名を変える(@sorted_logs など) また、「同じ文字列の場合は日付順にしたい」という要望も出てくると思うのですが、その際、古い順でよければ比較関数は省略できます。 (0埋めされた固定長の日付文字列は、文字コード昇順が、そのまま古い順になります。) my @sorted_logs = sort @lines; ※コンマ左の文字列の部分に、コンマより小さい文字コードの文字が入らないことが前提です。全角のみなら問題ありません。