質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.04%

ディレクトリ内の画像をファイルの制作日の順で並び変える方法

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 4,619

terataka

score 75

ディレクトリ内に画像を複数保存し、一覧表示させるようにしています。
現在はファイル名でのソートを行い、数字が大きい方が上(デジカメのナンバリングで新しい写真が上に来るように)になるように設定しています。
opendir(DIR, "$dir$in{'vno'}");
my @files = sort { $b cmp $a } readdir(DIR);
while (my $pname = shift @files ) {

if (substr($pname,-4,4) eq "\.jpg")  { # ディレクトリを抜いてjpgだけ出力

print<<"EOM";
<li><a href="./images/works/$in{'vno'}/$pname" class="fb" rel="g1"><IMG SRC="./images/works/$in{'vno'}/$pname" class="test"></a></li>
EOM
}
 }
closedir(DIR);
しかしこの方法だと、別のデジカメで撮影した時などファイル名がきちんと並んでいないと場合によっては撮影順になってくれません。
これを、撮影日(FTPでアップした日付?)でソートすることは可能でしょうか?
その場合どのように書き換えたらよいですか?
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

モジュールが使えるかどうか分かりませんので、標準関数だけでできるバージョンを書きます。


stat関数を使って、ファイルの属性を取得します。
この時、ファイル名とファイルの作成日時をセットにしたものをレコードにします。
ソート時は、これを使ってソートし、最後にファイル名だけに戻してあげます。

ちなみに、パソコンでファイルを日付順にする場合は、更新日にすることが多いです。
その場合は、$st[10]の代わりに$st[9]を使います。

# ディレクトリーを変数に
my $dir = "$dir$in{'vno'}";

opendir DIR, $dir;

# ファイル一覧の配列
my @tmp1 = readdir DIR;

# ファイル名とファイルの作成日時をレコード(リストの参照)にした配列
my @tmp2 =  map { my @st = stat "$dir/$_"; [ $_, $st[10] ] } @tmp1;

# 作成日の古い順にソート
my @tmp3 =  sort { $a->[1] <=> $b->[1] } @tmp2;

# ファイル名だけに戻す
my @files = map { $_->[0] } @tmp3;


あと、readdirとソートのところはループと分離して、ループはforeachを使って、
こんな感じにするともっと見やすくなると思いますよ。

my $dir = "$dir$in{'vno'}";

opendir DIR, $dir;
my @jpeg_files = grep { $_ =~ /\.jpe?g$/i } readdir DIR;
closedir DIR;

my @sorted_files =
  map { $_->[0] }
  sort { $a->[1] <=> $b->[1] }
  map { my @st = stat "$dir/$_"; [ $_, $st[10] ] } @jpeg_files;

foreach my $pname (@sorted_files) {
  print <<"EOM";
  ...
EOM
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/11/26 10:17

    ありがとうございます。
    下の方法を採用して、無事希望通りになりました!
    すごくシンプルになった分、私が内容をあまり理解できてないのが後々心配ですが…w

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる