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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

1回答

8263閲覧

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

terataka

総合スコア61

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2014/11/25 08:21

ディレクトリ内に画像を複数保存し、一覧表示させるようにしています。
現在はファイル名でのソートを行い、数字が大きい方が上(デジカメのナンバリングで新しい写真が上に来るように)になるように設定しています。

lang

1opendir(DIR, "$dir$in{'vno'}"); 2my @files = sort { $b cmp $a } readdir(DIR); 3while (my $pname = shift @files ) { 4 5if (substr($pname,-4,4) eq ".jpg") { # ディレクトリを抜いてjpgだけ出力 6 7print<<"EOM"; 8<li><a href="./images/works/$in{'vno'}/$pname" class="fb" rel="g1"><IMG SRC="./images/works/$in{'vno'}/$pname" class="test"></a></li> 9EOM 10} 11 } 12closedir(DIR);

しかしこの方法だと、別のデジカメで撮影した時などファイル名がきちんと並んでいないと場合によっては撮影順になってくれません。
これを、撮影日(FTPでアップした日付?)でソートすることは可能でしょうか?
その場合どのように書き換えたらよいですか?

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

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

lang

1# ディレクトリーを変数に 2my $dir = "$dir$in{'vno'}"; 3 4opendir DIR, $dir; 5 6# ファイル一覧の配列 7my @tmp1 = readdir DIR; 8 9# ファイル名とファイルの作成日時をレコード(リストの参照)にした配列 10my @tmp2 = map { my @st = stat "$dir/$_"; [ $_, $st[10] ] } @tmp1; 11 12# 作成日の古い順にソート 13my @tmp3 = sort { $a->[1] <=> $b->[1] } @tmp2; 14 15# ファイル名だけに戻す 16my @files = map { $_->[0] } @tmp3;

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

lang

1my $dir = "$dir$in{'vno'}"; 2 3opendir DIR, $dir; 4my @jpeg_files = grep { $_ =~ /.jpe?g$/i } readdir DIR; 5closedir DIR; 6 7my @sorted_files = 8 map { $_->[0] } 9 sort { $a->[1] <=> $b->[1] } 10 map { my @st = stat "$dir/$_"; [ $_, $st[10] ] } @jpeg_files; 11 12foreach my $pname (@sorted_files) { 13 print <<"EOM"; 14 ... 15EOM 16}

投稿2014/11/25 13:30

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

terataka

2014/11/26 01:17

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問