反转 readdir 的工作方式(最后一个文件在前)

reverse the way readdir works (last file first)

我有一个包含 n 个文件的目录,所有文件都匹配模式 /^\d\d\d\d$/ 通过它我使用 while (my $file = readdir ($DIR) ) { ... } 以避免一次将整个目录读取到 RAM。 在这个循环中,我计算文件(不包括目录和未相应命名的文件)并从指定点开始挑选出五个文件,并将每个文件的前两行读入一个数组。

其实我的两个问题是:

  1. 是否可以从目录中的最后一个文件开始循环,从文件名最大的文件开始,一直到 "back"? (我猜每个 OS 都会 return 这些文件的顺序是 0000 -> 0001 -> 0002 ...)

  2. 因为这会更容易,所以与一个一个地读取整个列表相比,只读取数组中的整个目录有多糟糕?

完整代码块:

while ( my $f = readdir ($DIR) ){

    print "checking " .  $f . "\n";
    next unless -f ($dir . "/" . $f);
    next unless $f =~ /^\d\d\d\d$/;

    $c++;

    if ( $c >= $index && $c <= $index + 4 ){
        open (my $ITM, "<", "$dir/$f") or die "Opening file $f in $dir failed:$!\n";
            my $headline = <$ITM>; my $first_p = <$ITM>;
        close $ITM;

            chomp ($headline, $first_p);
            push (@content, $headline, $first_p); 

        print $f . " was checked succesfully!\n";
    }
}

提前致谢

  1. 文件系统通常 return 目录条目的顺序不可预测。它们不会按字母顺序排序。 (可能 Windows 除外?不确定。)

  2. 即使您在那个目录中有一百万个文件,那也只是一个 "mega"。因此,如果每个名称需要 10 个字节来存储,那也只是 10 MB 的 RAM。好的,在 Perl 的内部数据结构中有一些开销,但几乎可以肯定的是,您的名字将少于一百万。所以我想说一点也不差。

使用 glob() 获取文件列表。

my @files = grep /\/\d{4}$/, glob( "$dir/*" );

然后您可以按任意顺序对它们进行排序。