匿名質問者

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人5回まで
  • 登録:
  • 終了:2017/01/28 11:08:40

ベストアンサー

匿名回答1号 No.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;
匿名質問者

ありがとうございます!

2017/01/28 11:08:34

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません