ファイルのリストをアルファベット順でソート

CGIテクニック集トップへ





概要

ファイルリスト表示をアルファベット順で行います。単純なリスト表示はディレクトリ内のファイルの一覧表示を参照ください。ファイル更新時間順でのソートはファイルのリストを更新順でソートを参照ください。

必用な処理

  1. オープンするディレクトリを開く
  2. ディレクトリ内のファイルを配列に挿入
  3. 配列内から必用なファイルのみ抽出
  4. 配列をアルファベット順にソート
  5. 配列の内容を表示

サンプルコード

 my $dir = "filedir";
 
 opendir(DIR, "$dir") or die "ディレクトリ$dirが開けません";
 my @filelist = grep !/^\./, readdir DIR;
 closedir(DIR);
 
 @filelist = sort {$a cmp $b} @filelist;
 
 print "<ul>\n";
 foreach my $file (@filelist){
    print "<li>$file</li>\n";
 }
 print "</ul>\n";

コードの解説

 my $dir = "filedir";
 
 opendir(DIR, "$dir") or die "ディレクトリ$dirが開けません";
 my @filelist = grep !/^\./, readdir DIR;
 closedir(DIR);

$dirにはリスト表示させたいディレクトリ名を保存します。 opendirで$dirをオープンします。失敗すればエラーメッセージと共にスクリプトは終了します。 ファイルハンドルDIRの内容をreaddirで取り込みます。その出力をgrep !/^\./により.で始まるファイル名を除いて配列@filelistに入力します。抽出したいファイル名だけ@filelistに入れるなどの処理もgrepにより可能です。@filelistにはディレクトリfiledir内に格納されている全てのファイル(.から始まるファイルを除く)が入っています。ファイルハンドルDIRに対して必用な処理はこれだけなのでDIRをクローズします。

 @filelist = sort {$a cmp $b} @filelist;

sort関数で@filelistの配列をアルファベット順に並び替えます。通常{$a cmp $b}は省略でき、以下のように記述することができます。。

 @filelist = sort @filelist;

逆順に並べる場合は、

 @filelist = sort {$b cmp $a} @filelist;

のように{$b cmp $a}にします。

数字順に並べ替える場合は、

 @filelist = sort {$a <=> $b} @filelist;

のように<=>を使います。

数字順で降順に並べ替える場合は、

 @filelist = sort {$b <=> $a} @filelist;

のように{$b <=> $a}にします。

 print "<ul>\n";
 foreach my $file (@filelist){
    print "<li>$file</li>\n";
 }
 print "</ul>\n";

foreachで@filelistに入っているファイルを一つずつ表示します。ここでは便宜上<li></li>で囲まれたHTMLとして出力しています。@filelistのファイルそれぞれに対して表示以外の必用な処理をすることも可能です。

関連するCGIテクニック

ディレクトリ(フォルダ)内のファイルの一覧表示
ファイルのリストを更新順でソート
サブディレクトリ内にある全てのファイルを抽出する方法