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;
}

これは機能します。しかし、2 番目と 3 番目では、エラー メッセージが表示されます。どうすればそれらを機能させることができますか?

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

2番目の例について

<->使いのRakudo Perlでは動かなかったかもしれませんが、最近のバージョンでは修正されています。(これは、当時よりも優れた最長トークン マッチング アルゴリズムを必要とする深い解析の問題に関係していました。)

3番目の例について

ステートメント

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

はデータ型$listとして作成され、要素は不変であると見なされます。あなたが本当に望むのは、次のように になることです:SeqSeq$listArray

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 に答える