19 May 2005
This post may be outdated due to it was written on 2005. The links may be broken. The code may be not working anymore. Leave comments if needed.

想写点 Perl 6 的东西,却不知道从哪写起,只好写一步算一步了。

子程序参数传递

在 Perl 5 中一般来说都用如下代码获得子程序的参数:
sub foo {
    my ($a, $b) = @_; # or my $self = shift;
在 Perl 6 中
  • 我们可以这么写
    sub foo ($a, $b) {
  • 也可以这么写
    sub foo {
        ($^a, $^b).say;
    }
    &foo(11,22); # print 1122
    $^a 得到第一个参数,$^b 得到第二个参数。猜测下如下是什么结果:
    sub foo {
        ($^c, $^b).say;
    }
    &foo(11,22);
    结果是 2211, 在闭包里所以以 $^ 开头的变量按 Unicode 码排序依次获得参数。(这里的变量可以是 $^cc, $^1y 等)
    我们管这种方式为 placeholder arguments, 中文翻译为“占位符参数”。
  • 如果是匿名函数的话还可以这么写
    my $func = -> $a, $b { print $a,$b };
    $func.(11,22);

for 循环语句

foreach 将不再被使用。 Perl 6 中 for 语句一般这么写:
for @foo {...}
这跟 Perl 5 中没有区别。另一种为:
for @foo -> $item { print $item }
-> 这种写法是种很强大的写法。
  1. 一次取多个变量,例如:
    my @foo = (1,2,3);
    for @foo -> $item1, $item2 {
        print $item1, $item2, '-';输出为 12-3-
    }
  2. 历遍一个 Hash 的写法:(%hash.kv 是将 %hash 变为一个列表,($key1, $value1, $key2, $value2, ...)
    for %hash.kv -> $key, $value { print "$key => $value\n" }
  3. 多个数组写法:(这在 Perl 5 中要用两个 for 才行)
    for zip(@a;@b) -> $a, $b { print "[$a, $b]\n" }
    # or for @a ¥ @b ¥ @c -> $a, $b, $c { print "[$a, $b, $c]\n" }
    
    ¥ 是 zip 的操作符。

最后值得注意的是

for @foo -> $item { print $item }
这种写法里 $item 是只读的,不是可写的。如果想要在块里改变 $item 的值,必须在后面加上 is rw (rw 是可读写 readwrite 的缩写)
my @foo = (1,2,3);
for @foo -> $item is rw {
    $item ~= 'a'; # 连接字符串以前用 $a . $b, 现在要用 $a ~ $b 了
    print $item;
}
而 for @foo { ... } 中 $_ 默认为可读写,也就是说它等同于 for @foo -> $_ is rw { ... }

Correct me if I'm wrong

Enjoy!


blog comments powered by Disqus