Импорт функции raku `dir` в Perl - PullRequest
       2

Импорт функции raku `dir` в Perl

3 голосов
/ 10 января 2020

Я уже некоторое время изучаю perl6 / raku, и мне действительно нравится dir рутина https://docs.perl6.org/routine/dir. Это очень удобно и просто в использовании.

Есть ли способ импортировать / backport dir в Perl? Я не могу получить никаких результатов при поиске inte rnet.

Ответы [ 3 ]

8 голосов
/ 10 января 2020

Это очень похоже на то, что вы получаете от readdir .

use strict;
use warnings;
open my $dh, $dirpath or die "Failed to open $dirpath: $!";
foreach my $file (readdir $dh) {
  next if $file eq '.' or $file eq '..';
  print "$dirpath/$file: $file\n";
}

My Dir :: ls делает это немного аккуратнее, но оно разработано более эмулировать ls, чем быть полезным для программирования.

use strict;
use warnings;
use Dir::ls;
foreach my $file (ls $dirpath) {
  print "$dirpath/$file: $file\n";
}

Path :: Tiny упрощает общий случай как обычно - все пути являются объектами Path :: Tiny.

use strict;
use warnings;
use Path::Tiny;
foreach my $filepath (path($dirpath)->children) {
  my $file = $filepath->basename;
  print "$filepath: $file\n";
}

И он может фильтровать по регулярному выражению (применяется к базовому имени, а не к полному пути):

path($dirpath)->children(qr/\.txt$/);
2 голосов
/ 10 января 2020

Ну, есть File::List::Object, у которого есть readdir метод, который делает нечто подобное. Хотя это не лень.

File::List::Object->new()->readdir('C:\');
1 голос
/ 11 января 2020

То, что dir делает, это три вещи

  • Возвращает IO :: дескрипторы пути
  • ... отфильтрованные регулярным выражением ..
  • ... в списке ленивый .

Путь :: Крошка, упомянутый Гриннцем, подошел бы ближе всего ... если только он не ленив. Лень не входит в комплект Perl. Таким образом, вам придется объединить это с чем-то вроде Object::Trampoline, чтобы на самом деле достичь этого. Вы должны были бы "трамполинировать" конструкцию Path::Tiny объектов, используя это.

...