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

Perl 如何一次读取10个文件名,处理它们,然后读取下一个10个?,perl,filesystems,filenames,readdir,Perl,Filesystems,Filenames,Readdir,在Perl中,如何将目录中的文件名一次只读入10个Perl数组? 我找到的所有目录读取解决方案似乎只是一次将整个文件列表读取到一个数组中,但我不想一次读取所有文件,因为可能会有数百万个文件,我希望减少内存占用。从perldoc页面可以看到,在标量上下文中,readdir返回单个目录项: readdir DIRHANDLE 返回目录的下一个目录项 由opendir打开。如果在列表上下文中使用,则返回 目录中的条目。如果没有更多条目,则返回 标量上下文中未定义的值和列表中的空列表 上下文 来自同一页

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

从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返回的目录变量,而不使用$特殊变量。

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;
过程_filesplice@buf; 是过程的简称_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);
}
这允许您内联处理_文件。例如,如果你有

sub process_files {
   print("$_\n") for @_;
}
您现在可以替换

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


谢谢你,布鲁诺·拉莫斯。那么,while循环一次只读取一个文件名吗?哇!谢谢你@ikegami。我很荣幸你回答:
if (!defined($fn) || @buf == 10) {
   print("$_\n") for splice(@buf);
}