幼稚園時代「何組」でしたか?

こんにちわ。
例えば、

あいう,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;
}
ではどこがいけないのでしょうか?
教えてください。お願いします。

A 回答 (1件)

> ではどこがいけないのでしょうか?


ということですが、どのようにダメなのでしょうか?

コピーして確認したところ、単に逆順にソートされてしまうだけのようです。
文字列を昇順(あいうえお順)にソートしたい場合、
  $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;
※コンマ左の文字列の部分に、コンマより小さい文字コードの文字が入らないことが前提です。全角のみなら問題ありません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!