perl6 / rakudo: проблема с записью в переменную цикла - PullRequest
3 голосов
/ 18 февраля 2011
#!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 Ответ

6 голосов
/ 18 февраля 2011

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

Возможно, <-> не работал в используемом вами 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$ 

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

Рт

...