Альтернатива Perl's <> в Раку?

11

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

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

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

Я хочу вернуть магию!

vonbrand
источник

Ответы:

17

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

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- то есть можно передать его любому коду, который ожидает дескриптор файла.

Джонатан Уортингтон
источник
1
или педантично: raku script.raku foo bar. ;-)
p6steve
0

Для тебя достаточно магии?

sub MAIN( Str $file where *.IO.f  )
{
    .say for $file.IO.lines.map: *.comb.join(':');
}
Holli
источник
2
Это круто, и OP должен попробовать это, но это не то же самое в нескольких отношениях. См. Ответ jnthn о том, как имитировать <>поведение, и обратите внимание, что raku .combбез аргумента разбивает строку на отдельные символы, тогда как Perl splitбез аргумента - afaik, .split(/\s+/)в raku.
raiph
Альтернативой .splitможет быть .words- docs.perl6.org/type/Str#routine_words
дональд
1
Почему, святой Рнгес, я забываю о wordsметоде?
Холли