На данный момент я знаю два способа открыть и прочитать каталог в Perl. Вы можете использовать opendir
, readdir
и closedir
или просто использовать glob
для получения содержимого каталога.
Пример:
Использование opendir
, readdir
и closedir
:
opendir my $dh, $directory;
my @contents = readdir $dh;
closedir $dh;
Использование glob
:
my @contents = <$directory/*>;
Мне сообщили, что в некоторых ситуациях метод glob
может давать непредсказуемые результаты (например, он может действовать по-разному в разных операционных системах, когда встречает специальные символы в именах каталогов).
Что мне нравится в методе glob
, так это то, насколько он «быстрый и грязный». Это одна простая линия, и она выполняет свою работу, но если она не работает во всех ситуациях, это может привести к неожиданным и трудным для поиска ошибкам.
Мне было интересно, существует ли что-то вроде «сокращенного» способа использования метода
opendir
,readdir
,closedir
?
Может быть, что-то вроде этого причудливого метода прихлебывания файла strong> в одной строке, которую я недавно обнаружил.
mkdir "foo bar" && touch "foo bar/baz" && perl -E '$dir = "foo bar"; say for <$dir/*>'
(можно разрешить, указав аргументglob
) - person ThisSuitIsBlackNot   schedule 06.05.2015opendir
? - person tjwrona1992   schedule 06.05.2015sub dir_contents { my ($path) = @_; opendir my $dh, $path or die $!; return readdir $dh }
;) Я знаю, что это заманчиво, но, пожалуйста, не попадайтесь в ловушку, пытаясь всегда делать что-то одной строкой. Это делает ваш код менее читабельным и сложным для отладки и сопровождения. - person ThisSuitIsBlackNot   schedule 06.05.2015perldoc File::Glob
для получения дополнительной информации. - person Andy Lester   schedule 06.05.2015:)
- person tjwrona1992   schedule 06.05.2015<...>
иglob(qq<...>)
(кроме случаев, когда<...>
означаетreadline(...)
, конечно). - person ikegami   schedule 06.05.2015glob()
была более безопасной версией<>
. Моя вина. - person Andy Lester   schedule 06.05.2015