perl6/rakudo: проблема с записью в переменную цикла

#!perl6
use v6;

my $longest = 3;
my @list = <a b c d e f>;

for @list -> $element is rw {
    $element = sprintf "%*.*s", $longest, $longest, $element;
    $element.say;
}

Это работает. Но во втором и третьем я получаю сообщение об ошибке. Как я мог заставить их работать?

#!perl6
use v6;

my $longest = 3;
my @list = <a b c d e f>;

for @list <-> $element {
    $element = sprintf "%*.*s", $longest, $longest, $element;
    $element.say;
}

# ===SORRY!===
# Missing block at line 11, near ""

,

#!perl6
use v6;

my $longest = 3;
my $list = <a b c d e f>;

for $list.list -> $element is rw {
    $element = sprintf "%*.*s", $longest, $longest, $element;
    $element.say;
}

# Cannot modify readonly value
#   in '&infix:<=>' at line 1
#   in <anon> at line 8:./perl5.pl
#   in main program body at line 1

1 ответ

Решение

Относительно вашего второго примера

<-> возможно, не работал в используемом вами Rakudo Perl, но это было исправлено в более поздних версиях. (Это было связано с проблемой глубокого разбора, которая требовала лучшего алгоритма сопоставления длинных токенов, чем мы имели в то время.)

Относительно вашего третьего примера

Заявление

my $list = <a b c d e f>;

создает $list как Seq тип данных и Seq элементы считаются неизменными. То, что вы действительно хотите, для $list стать Array, как в:

my $list = [<a b c d e f>];

С этим на месте, последний пример работает как ожидалось:

pmichaud@orange:~/rakudo$ cat x.p6
#!perl6
use v6;

my $longest = 3;
my $list = [<a b c d e f>];

for $list.list -> $element is rw {
    $element = sprintf "%*.*s", $longest, $longest, $element;
    $element.say;
}

pmichaud@orange:~/rakudo$ ./perl6 x.p6
  a
  b
  c
  d
  e
  f
pmichaud@orange:~/rakudo$ 

Надеюсь это поможет!

Вечера

Другие вопросы по тегам