Операции с файлами в Perl 6

Original author: Moritz
  • Translation

Директории


Вместо 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
        }

Similar posts

Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 6

    +6
    Скажите, а давно на хабре куски мануала считаются ок-статьями?
      +1
      Это же перевод статьи.

      По хорошему стоило перевести все статьи из данного цикла и в концее ссылки приводить.
      0
      given open('foo', :w) {
          .say('Всем привет!');
          .close
      }

      Это вроде with, да? А нет ли конструкции, которая будет автоматически закрывать файл (что-то вроде try-with-resources)?
        0
        Насколько стабильны описываемые функции/идиомы? Может ли произойти так, что после релиза Perl 6 придётся узнавать о других способах работы с аргументами/файлами/о чём там ещё будет речь?
          0
          Насколько стабильны описываемые функции/идиомы?

          Там, если я не ошибаюсь, заморозка была. Теперь апи до релиза не должно менять.

          Может ли произойти так, что после релиза Perl 6 придётся узнавать о других способах работы с аргументами/файлами/о чём там ещё будет речь?

          Наверняка. There is more than one way to do it.
          –2
          Я вот не понимаю почему ЭТО называют Perl'ом…

          Only users with full accounts can post comments. Log in, please.