Альтернатива Perl в <Raku? - PullRequest
11 голосов
/ 30 марта 2020

Здесь я учусь тому, как обходить Раку (neé Perl 6), очень приятно повсюду. Но мне очень не хватает волхвов c <> из Perl 5, где вы можете просто:

my $x = <>;
print $x;
while(<>) {
  print join(':', split);
}

(прочитать следующую строку ввода в $x, l oop по остальным; ввод производится из файлов, названных как ввод или стандартный ввод, если файл не указан). "Perl 5-6" руководства / руководства по миграции / ... просто говорят о slurp использовании всего файла или open об отдельных файлах по имени. Никаких магов c "не принимать входные данные из именованных файлов в последовательности", которые я могу найти.

Я хочу, чтобы маги c вернулись!

Ответы [ 2 ]

17 голосов
/ 31 марта 2020

Функциональность, которую вы ищете, в основном существует. Этот сценарий:

my $x = get();
say "First: $x";
for lines() {
    .say
}

С учетом этих входных файлов:

$ cat foo
foo line 1
foo line 2
$ cat bar
bar line 1
bar line 2

Будет при вызове:

raku script.p6 foo bar

Произвести вывод:

First: foo line 1
foo line 2
bar line 1
bar line 2

Он также будет принимать вывод из $*IN, если нет файлов. Единственное, чего не существует, - это единственной замены для <>, поскольку это будет зависеть от функциональности, подобной wantarray, которая несовместима с множественной отправкой (и Раку считает, что множественная отправка гораздо полезнее).

Кандидаты с нулевым аргументом для get и lines реализованы в терминах $*ARGFILES, дескриптора файла, который обеспечивает функциональность получения файлов из списка аргументов или из $*IN - это означает, что его можно передать любому коду, который ожидает дескриптор файла.

0 голосов
/ 30 марта 2020

Хватит ли вам магий c?

sub MAIN( Str $file where *.IO.f  )
{
    .say for $file.IO.lines.map: *.comb.join(':');
}
...