Директории
Вместо opendir и его друзей, в Perl 6 есть одна функция dir, которая возвращает список файлов из директории (по умолчанию, из текущей). Вместо тысячи слов:
# в директории Rakudo
> dir
build parrot_install Makefile VERSION parrot docs Configure.pl README dynext t src tools CREDITS LICENSE Test.pm
> dir 't'
00-parrot 02-embed spec harness 01-sanity pmc spectest.data
У dir есть необязательный параметр test, для использования grep по результатам работы:
> dir 'src/core', test => any(/^C/, /^P/)
Parcel.pm Cool.pm Parameter.pm Code.pm Complex.pm CallFrame.pm Positional.pm Capture.pm Pair.pm Cool-num.pm Callable.pm Cool-str.pm
Создаются директории через mkdir('foo')
Файлы
Простейший способ прочесть файл в Perl 6 – slurp. Она возвращает содержимое файла в виде String
> slurp 'VERSION'
2010.11
Есть доступ и к классическим методам:
> my $fh = open 'CREDITS'
IO()<0x1105a068>
> $fh.getc # читает символ
=
> $fh.get # читает строчку
pod
> $fh.close; $fh = open 'new', :w # открывает на запись
IO()<0x10f3e704>
> $fh.print('foo Bool::True
> $fh.say('bar Bool::True
> $fh.close; say slurp('new')
foobar
Проверки файлов
Проверки файлов на существование и типы проходят через умное сопоставление ~~
> 'LICENSE'.IO ~~ :e # есть ли файл?
Bool::True
> 'LICENSE'.IO ~~ :d # а не директория ли это часом?
Bool::False
> 'LICENSE'.IO ~~ :f # ну значит файл?
Bool::True
Легкотня.
File::Find
Когда заканчиваются стандартные функции, к делу подключаются модули. File::Find из набора File::Tools проходит по дереву директорий в поисках нужных файлов и создаёт ленивые списки найденных. Он идёт в комплекте с Rakudo Star, и его легко установить через neutro.
Пример:
find(:dir<t/dir1>, :type<file>, :name(/foo/))
выдаст ленивый список файлов, и только файлов, в директории t/dir1 с именем, подходящим под регулярку /foo/. Элементы списка – не простые строчки. Это объекты, которые превращаются в строки с полным путём, но при этом у них есть акцессоры для имени директории, в которой они лежат (dir) и имени файла (name). Подробнее см. в документации.
Полезные идиомы
Создаём новый файл
open('new', :w).close
Безымянный хэндлер файла
given open('foo', :w) {
.say('Всем привет!');
.close
}
Автор: SLY_G