8

Perl でopendir, readdir, およびを使用してディレクトリを読み取るとclosedirreaddir関数は特定の順序でファイルを読み取るようには見えません (私にはわかります)。

エポックタイムスタンプで名前が付けられたサブディレクトリを持つディレクトリを読んでいます:

1224161460
1228324260
1229698140

これらのディレクトリを番号順に読みたいと思います。これにより、最も古いディレクトリが最初になります。

を使用するreaddirと、最初に読み取られるのは 1228324260 で、これが真ん中です。ディレクトリの内容を配列に入れて並べ替えることができることは知っていますがreaddir、並べ替えられた順序で読み取るために渡すことができるオプションはありますか? それとも、すべてを配列にプッシュして配列をソートするよりも、これを達成するためのよりエレガントな方法でしょうか? おそらくこれを行うためのモジュールもありますが、私たちの環境にモジュールをインストールするのは難しいので、組み込みモジュールでない限り、モジュールを使用したくない...

ありがとう!

編集 要求に応じて、使用しているコードを投稿しています:

opendir( my $data_dh, $data_dir ) or die "Cannot open $data_dir\n";
while ( my $name = readdir($data_dh) ) {
    next if ( $name eq '.' or $name eq '..' );
    my $full_path = "${data_dir}/${name}";
    next unless ( -d $full_path );
    process_dir($full_path);
}
closedir($data_dh);
4

3 に答える 3

13

readdirは配列コンテキストで呼び出すことができるので、次のようにしてください:

opendir( my $data_dh, $data_dir) or die "Cannot open $data_dir\n";
my @files = sort { $a <=> $b } readdir($data_dh);
while ( my $name = shift @files ) {
...
于 2009-01-12T17:42:40.020 に答える
5

sort再注文するリスト演算子の前にを投げるだけです。結果を配列に格納する必要もありません。あなたは使用することができますforeach

opendir my($dh), $dirname or die "Could not open directory [$dirname]: $!";

foreach my $file ( sort { $a <=> $b } readdir $dh )
    {
    ...
    }
于 2009-01-12T19:10:15.287 に答える
5

ちょっとした Glob マジックで試すことができます。glob はソートされた方法で機能しているように見えるので、次のようにします。

#  Glob in scalar context iterates the result set internally
while( defined( my $dir = glob($dir . '/*' ) ) ){ 
     print $dir, "\n";
    # $dir is fed ordered and with full names. 
}

また

# Glob in list context returns all results. 
for( glob($dir.'/*' ) ){ 
  print $dir , "\n";
  # also ordered. 
}

動作するはずです。次の理由から、グロブには注意してください。

 for(0..20){ 
   printf "%30s|%30s\n", glob($dir.'/*' ), glob($dir.'/*' );
 }

半魔法のようなことを行い、dir の内容を各行に 2 回出力します。すなわち:

/foo/bar/a  |  /foo/bar/a
/foo/bar/b  |  /foo/bar/b
/foo/bar/c  |  /foo/bar/c
/foo/bar/d  |  /foo/bar/d
于 2009-01-12T18:00:38.080 に答える