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);
}