人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

perlでファイル名でソートさせる方法

ディレクトリの中にある画像をファイル名順でソートさせて表示させたいです。
写真は日付+ナンバーで管理しようとしています。
(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」の部分を変えればいいと思うのですが、どのように変更したらファイル名順に変わってくれますか?

●質問者: 匿名質問者
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● 匿名回答1号
ベストアンサー

単に

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;

匿名質問者さんのコメント
ありがとうございます!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ