ディレクトリの中にある画像をファイル名順でソートさせて表示させたいです。
写真は日付+ナンバーで管理しようとしています。
(2017年1月1日の1枚目なら20170101_001.jpgのような感じでファイル名が小さい=古い写真となります)
現在以下の方法で「アップ時間(?)が新しい物が上にくる」ようにしていたのですが、FFFTPでアップするとなぜかたまに順番通りにアップしてくれない事があるのでファイル名順に変えようと思ってます。
##ディレクトリオープン
# 対象ディレクトリ(CGIを設置するディレクトリから見た位置を指定する
my $dir = "$dir$in{'vno'}";
opendir DIR, $dir;
# jpegファイルだけ取得
my @jpeg_files = grep { $_ =~ /\.jpe?g$/i } readdir DIR;
closedir DIR;
# 日付を取得して新しいのが上に来るようにする
my @sorted_files =
map { $_->[0] }
sort { $b->[1] <=> $a->[1] }
map { my @st = stat "$dir/$_"; [ $_, $st[9] ] } @jpeg_files;
foreach my $pname (@sorted_files) {
print <<"EOM";
<li><a href="./images/$in{'vno'}/$pname" class="fb" rel="g1"><IMG SRC="./images/$in{'vno'}/$pname" class="test"></a></li>
EOM
}
「my @sorted_files」の部分を変えればいいと思うのですが、どのように変更したらファイル名順に変わってくれますか?
単に
my @sorted_files = sort @jpeg_files;
でよいのでは
ソート前の物が必要ないなら最初から
my @jpeg_files = sort grep { $_ =~ /\.jpe?g$/i } readdir DIR;
とするとか
次のようなスクリプトでテストしたら行けたんで大丈夫ではないかと
use strict; use warnings; use List::Util; my @data = (); for(1..10) { my($year,$month,$day) = (localtime(rand(time())))[5,4,3]; for my $i(1..rand(10)+1) { my $file = sprintf("%04d%02d%02d_%03d.jpg",$year+1900,$month+1,$day,$i); push @data,$file; } } @data = List::Util::shuffle @data; print "$_\n" for @data; print '-'x16,"\n"; print "$_\n" for sort @data;
ありがとうございます!
2017/01/28 11:08:34