反转 readdir 的工作方式(最后一个文件在前)
reverse the way readdir works (last file first)
我有一个包含 n 个文件的目录,所有文件都匹配模式
/^\d\d\d\d$/
通过它我使用 while (my $file = readdir ($DIR) ) { ... }
以避免一次将整个目录读取到 RAM。
在这个循环中,我计算文件(不包括目录和未相应命名的文件)并从指定点开始挑选出五个文件,并将每个文件的前两行读入一个数组。
其实我的两个问题是:
是否可以从目录中的最后一个文件开始循环,从文件名最大的文件开始,一直到 "back"?
(我猜每个 OS 都会 return 这些文件的顺序是 0000 -> 0001 -> 0002 ...)
因为这会更容易,所以与一个一个地读取整个列表相比,只读取数组中的整个目录有多糟糕?
完整代码块:
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";
}
}
提前致谢
文件系统通常 return 目录条目的顺序不可预测。它们不会按字母顺序排序。 (可能 Windows 除外?不确定。)
即使您在那个目录中有一百万个文件,那也只是一个 "mega"。因此,如果每个名称需要 10 个字节来存储,那也只是 10 MB 的 RAM。好的,在 Perl 的内部数据结构中有一些开销,但几乎可以肯定的是,您的名字将少于一百万。所以我想说一点也不差。
使用 glob()
获取文件列表。
my @files = grep /\/\d{4}$/, glob( "$dir/*" );
然后您可以按任意顺序对它们进行排序。
我有一个包含 n 个文件的目录,所有文件都匹配模式
/^\d\d\d\d$/
通过它我使用 while (my $file = readdir ($DIR) ) { ... }
以避免一次将整个目录读取到 RAM。
在这个循环中,我计算文件(不包括目录和未相应命名的文件)并从指定点开始挑选出五个文件,并将每个文件的前两行读入一个数组。
其实我的两个问题是:
是否可以从目录中的最后一个文件开始循环,从文件名最大的文件开始,一直到 "back"? (我猜每个 OS 都会 return 这些文件的顺序是 0000 -> 0001 -> 0002 ...)
因为这会更容易,所以与一个一个地读取整个列表相比,只读取数组中的整个目录有多糟糕?
完整代码块:
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";
}
}
提前致谢
文件系统通常 return 目录条目的顺序不可预测。它们不会按字母顺序排序。 (可能 Windows 除外?不确定。)
即使您在那个目录中有一百万个文件,那也只是一个 "mega"。因此,如果每个名称需要 10 个字节来存储,那也只是 10 MB 的 RAM。好的,在 Perl 的内部数据结构中有一些开销,但几乎可以肯定的是,您的名字将少于一百万。所以我想说一点也不差。
使用 glob()
获取文件列表。
my @files = grep /\/\d{4}$/, glob( "$dir/*" );
然后您可以按任意顺序对它们进行排序。