2009-10-14 2 views
3

Я пишу скрипт, который ищет определенные файлы в каталоге и обрабатывает их. Я продолжаю писать следующее:Как я могу прочитать каталог в Perl с одним выражением?

opendir DIR, $dir; 
@files = readdir DIR; 
closedir DIR; 

В то время как я мог (а на самом деле должны) обернуть это в функции, мне было интересно, если есть более элегантный способ сделать это?

+0

Возможно, вы захотите проверить ответы на этот вопрос: http://stackoverflow.com/questions/ 1506801/what-reason-are-there-to-prefer-glob-over-readdir-or-vice-versa-in-perl – innaM

+1

Что именно вы подразумеваете под «написать каталог»? –

+0

Я на самом деле имею в виду «написать следующий код *» –

ответ

14

Наиболее элегантным является использование функции, которую еще кто-то написал.

use File::Slurp; 

@files = read_dir $dir; # . and .. are removed by default 
1

Мне нравится использовать File::Find для такого рода вещей.

+1

Зачем вам нужен поиск глубины для получения списка файлов из одного каталога? –

5

Другим способом было бы использовать do блок:

my @files = do { 
    opendir my $d, '/your/dir/'; 
    readdir $d; 
}; 

Его более элегантный, потому что мой $ d локальна блокировать (в отличие от вашего DIR глобальный) и closedir не требуется, потому что указатель_на_файл является автоматически закрывается, когда $ d выходит за рамки.

/I3az/

0

Никто не предложил glob еще? Хорошо, здесь идет:

@files = glob("$dir/*"); 

Или, если вам нужно файлы, начинающиеся с точки, тоже:

@files = glob("$dir/{.,}*") 
0

Глоб является самым простым решением. Я не знаю, что, по вашему мнению, первые три строки относятся к подпрограмме, если вы не открываете файлы более одного раза

Смежные вопросы