3
#!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
4

1 回答 1

7

关于你的第二个例子

可能在您使用的<->Rakudo Perl 中不起作用,但它已在更新的版本中得到修复。(这与一个深度解析问题有关,该问题需要比我们当时更好的最长令牌匹配算法。)

关于你的第三个例子

该声明

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

创建$listSeq数据类型,并且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$ 

希望这可以帮助!

下午

于 2011-02-18T16:06:56.927 回答