Как я могу прочитать каталог на Perl с помощью одного оператора?

Я пишу сценарий, который ищет определенные файлы в каталоге и обрабатывает их. Продолжаю писать следующее:

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

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


person Nathan Fellman    schedule 14.10.2009    source источник
comment
Возможно, вы захотите проверить ответы на этот вопрос: stackoverflow.com/questions/1506801/   -  person innaM    schedule 14.10.2009
comment
Что именно вы имеете в виду под написанием каталога?   -  person Sinan Ünür    schedule 14.10.2009
comment
На самом деле я имею в виду написание следующего кода   -  person Nathan Fellman    schedule 14.10.2009
comment
Не могли бы вы отредактировать заголовок вашего вопроса?   -  person innaM    schedule 14.10.2009
comment
Ох ... я забыл, что написал это в названии :)   -  person Nathan Fellman    schedule 14.10.2009
comment
Спасибо. (разве нельзя обмануть минимальную длину глупого комментария?)   -  person innaM    schedule 15.10.2009
comment
да, если вы добавите жалобу, как вы это сделали :)   -  person Nathan Fellman    schedule 15.10.2009


Ответы (5)


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

use File::Slurp;

@files = read_dir $dir;  # . and .. are removed by default
person dave4420    schedule 14.10.2009

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

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

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

/I3az/

person draegtun    schedule 14.10.2009

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

person Zoran Simic    schedule 14.10.2009
comment
Зачем вам выполнять поиск в глубину, чтобы получить список файлов из одного каталога? - person brian d foy; 15.10.2009

Еще никто не предложил glob? Хорошо, вот и:

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

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

@files = glob("$dir/{.,}*")
person mob    schedule 14.10.2009

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

person user188563    schedule 14.10.2009