アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のようなファイル名が複数あります。

abcd_021106_0.txt
abcd_021106_1.txt
abcd_021106_2.txt
abcd_021106_11.txt

これを @list = glob("abcd_021106_*");で
取得すると、配列には、

(0) abcd_021106_0.txt
(1) abcd_021106_1.txt
(2) abcd_021106_11.txt
(3) abcd_021106_2.txt

というふうに格納されてしまいます。
これではまずいので、きちんと末尾の順番どおり
sort するには どのようにすればいいのでしょうか。
よろしくご指南ください。

A 回答 (3件)

急いで書いたので可読性が悪く、極意と言うほど一般化できませんでしたが、下記で出来ますよ。


ファイル名の形式が、「文字列_数字_数字.拡張子」となっている場合しか使えません。
形式が違う場合は、正規表現と、<=>、cmpを入れ替えて使ってください。


@orglist = glob("abcd_021106_*");

foreach (@orglist) {
my ($nofi) = $_ =~ m/^(\w+)\.\w+$/;
push(@tmplist, [$_, split("_", $nofi)]);
}
@newlist = sort {$a->[1] cmp $b->[1] || $a->[2] <=> $b->[2] || $a->[3] <=> $b->[3]} @tmplist;
@list = ();
foreach (@newlist) {
push(@list, $_->[0]);
}

この時点で、@listに期待した順番でファイル名が入っているはずです。
    • good
    • 0
この回答へのお礼

スクリプトまでご紹介くださり、ありがとうございます。
そのまま貼り付ける形で実行できることを確認しました。
貴重な時間を割いていただき、感謝いたします。

お礼日時:2002/11/07 14:28

ご要望のソートは、次のスクリプトで実現できます。


  @list = map {$_->[0]}                    # 3
        sort {$a->[1] <=> $b->[1]}           # 2
          map {[$_,/^abcd_\d{6}_(\d+)/]} @list;   # 1
これは、
1.元データと末尾の数値からなる"無名配列のリスト"を生成
2.末尾の数値で"無名配列のリスト"をソート
3.ソートされた"無名配列のリスト"から、元データを取り出す
という流れになっています。

ファイルの命名規則が「名前_日付_番号.txt」となっているようですので、これを「名前順 かつ 日付順 かつ 番号順」でソートする場合、次のようにします。
  @list = glob("*_*_*.txt");     # globのパターンも変える
  @list = map {$_->[0]}
        sort {$a->[1] cmp $b->[1] || $a->[2] <=> $b->[2] || $a->[3] <=> $b->[3]}
          map {[$_,/^([a-z]+)_(\d{6})_(\d+)/]} @list;

アルゴリズムについては、参考URLのページもご参考ください。

参考URL:http://www.din.or.jp/~ohzaki/perl.htm#SortST
    • good
    • 0
この回答へのお礼

スクリプトと詳細に解説していただき、ありがとう
ございます。ご紹介いただいた URL も 大いに参考に
なりました。自分でも探したつもりでしたが、見つける
ことができませんでした。
貴重な時間を割いていただき、感謝いたします。

お礼日時:2002/11/07 14:31

ソートですが、下記のものが正しいですね。


そうならないように以下のように工夫してもらうしかないです。

(0) abcd_021106_00.txt
(1) abcd_021106_01.txt
(2) abcd_021106_02.txt
(3) abcd_021106_11.txt

以上のように桁数をあわせてあげれば、あなたが思ったようにソートされます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
このようなフォーマットにするのが正当なんですね。
以後、参考にさせていただきます。

お礼日時:2002/11/07 14:26

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