如何一次读取10个文件名,处理它们,然后读取下一个10



在Perl中,如何一次只将目录中的文件名读取到Perl数组中10个?我找到的所有目录读取解决方案似乎只会一次将整个文件列表读取到一个数组中,但我不想一次读取所有文件,因为可能有数百万个文件,我想减少内存占用。

opendir用于逐文件读取目录。然后这只是一个缓冲结果的问题,直到你得到正确的数字。

my $dir_qfn = "...";
my @buf;
opendir(my $dh, $dir_qfn)
or die("Can't open directory "$qfn": $!n");
while (defined( my $fn = readdir($dh) )) {
my $qfn = "$dir_qfn/$fn";
push @buf, $qfn;
process_files(splice(@buf)) if @buf == 10;
}
process_files(@buf) if @buf;

process_file(splice(@buf));只是process_file(@buf); @buf = ();的缩写


这是直接的编写方法,但如果您想消除重复的子调用呢?

my $dir_qfn = "...";
my @buf;
opendir(my $dh, $dir_qfn)
or die("Can't open directory "$qfn": $!n");
while (1) {
my $fn = readdir($dh);
if (defined($fn)) {
my $qfn = "$dir_qfn/$fn";
push @buf, $qfn;
}
if (!defined($fn) || @buf == 10) {
process_files(splice(@buf));
}
last if !defined($fn);
}

这允许您内联process_file。例如,如果你有

sub process_files {
print("$_n") for @_;
}

您现在可以更换

if (!defined($fn) || @buf == 10) {
process_files(splice(@buf));
}

带有

if (!defined($fn) || @buf == 10) {
print("$_n") for splice(@buf);
}

在readdir perldoc页面中,您可以看到readdir在标量上下文中返回一个目录条目:

readdir DIRHANDLE

返回目录的下一个目录项由opendir打开。如果在列表上下文中使用,则返回目录中的条目。如果没有更多条目,则返回标量上下文中未定义的值和列表中的空列表上下文

来自同一页面的示例代码:

opendir(my $dh, $some_dir) || die "Can't open $some_dir: $!";
while (readdir $dh) {
print "$some_dir/$_n";
}
closedir $dh;

请注意,这是示例代码,在实际脚本中,您可能会更好地为readdir返回的目录显式声明一个变量,而不使用$_特殊变量。

最新更新