Perl には x
演算子があり、x 3
といった具合に繰り返し回数を付ける事で連続した文字列を簡単に作り出すことが出来る。
say 1 x 3; # 111
say "foo" x 3; # foofoofoo
これは Perl5 でもお馴染み。しかし Perl6 の Range は凄い。
say 1 xx 3; # (1 1 1)
say "foo" xx 3; # (foo foo foo)
連続した配列要素が作り出せる。それどころか無限リストが作り出せる。
say 1 xx *; # (...)
say "foo" xx *; # (...)
もちろん無限数列も作れる。
(1 .. *)[^10].perl.say; # (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
fibonacci 数列もこんなに簡単。
(1, 1, *+* ...^ *)[^100].perl.say;
上記の様に無限リストをスライスするには [^10]
や [40..42]
の様に指定する。要素は数字や文字列に限った話ではない。
my $a = <a b c>;
my $b = $a xx *;
say $b[^5]; # ((a b c) (a b c) (a b c) (a b c) (a b c))
配列の繰り返しも可能だし、|
を使えばダイナミックバインディングも使える。
my $a = <a b c>;
my $b = |$a xx *;
say $b[^10]; # (a b c a b c a b c a)
応用すれば FizzBuzz だって。
my $r = 0;
my $a = sub {
$r++;
given 0 {
when $r % 15 { "FizzBuzz" }
when $r % 3 { "Fizz" }
when $r % 5 { "Buzz" }
default { $r };
}
};
my $b = |$a() xx *;
say $b[^20];
この |
、実は凄くて
multi sub foo(Str $a) {
say "foo1";
}
multi sub foo(Str $a, Str $b) {
say "foo2";
}
my $a = <a>;
foo |$a; # foo1
$a = <a b>;
foo |$a; # foo2
メソッドのダイナミック呼び出しも出来る。Perl6 凄い。