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$
Надеюсь это поможет!
Вечера