• ベストアンサー

sort の極意

以下のようなファイル名が複数あります。 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 するには どのようにすればいいのでしょうか。 よろしくご指南ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • retr
  • ベストアンサー率75% (30/40)
回答No.2

急いで書いたので可読性が悪く、極意と言うほど一般化できませんでしたが、下記で出来ますよ。 ファイル名の形式が、「文字列_数字_数字.拡張子」となっている場合しか使えません。 形式が違う場合は、正規表現と、<=>、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に期待した順番でファイル名が入っているはずです。

yasu
質問者

お礼

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

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

ご要望のソートは、次のスクリプトで実現できます。   @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
yasu
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

ソートですが、下記のものが正しいですね。 そうならないように以下のように工夫してもらうしかないです。 (0) abcd_021106_00.txt (1) abcd_021106_01.txt (2) abcd_021106_02.txt (3) abcd_021106_11.txt 以上のように桁数をあわせてあげれば、あなたが思ったようにソートされます。

yasu
質問者

お礼

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

すると、全ての回答が全文表示されます。

関連するQ&A