У меня есть каталог, содержащий n файлов, все из которых соответствуют шаблону /^\d\d\d\d$/
, через который я иду с while (my $file = readdir ($DIR) ) { ... }
, чтобы избежать одновременного чтения всего каталога в ОЗУ. В этом цикле я подсчитываю файлы (исключая каталоги и файлы без соответствующих имен) и выбираю пять файлов, начиная с указанной точки, и читаю первые две строки каждого файла в массив.
На самом деле у меня два вопроса:
Можно ли запустить цикл с последнего файла в каталоге, начиная с файла с самым большим именем файла и возвращаясь «назад»? (Я предполагаю, что каждая ОС будет возвращать эти файлы в порядке 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";
}
}
заранее спасибо
<pre><code>
(встроенный HTML) вместо простого отступа (что является синтаксисом Markdown для блоков кода). - person melpomene   schedule 19.11.2016-f
... Таким образом, вы избежите дорогостоящего вызоваstat
для имен, не соответствующих шаблону. - person Sinan Ünür   schedule 19.11.2016$
допускает перевод строки в конце имени, а\d
соответствует любой цифре Unicode (не только 0-9). Я бы использовал/\A\d{4}\z/a
(или/\A[0-9]{4}\z/
, если в вашем Perl еще нет/a
). - person melpomene   schedule 19.11.2016glob('[0-9]' x 4)
, чтобы просто получить числовые имена. - person melpomene   schedule 19.11.2016