前段时间看到报道说,puppet 的作者本来是用 perl 完成的原型设计,后来改用的 ruby。所以我想,目前这个 puppet 的 DSL 设计,用 perl 来完成的话,应该如何做。

这里碰到一个问题,就是 puppet 中 resource_typetitle 后面有个冒号,这事儿比较麻烦,不过这时候我突然想到了 Perl6 ,稍微翻了一下文档,发现这事用 Perl6 来实现很容易:

use v6;

sub infix:<:>($a, %b){
    return $a, %b;
};

sub service(&service) {
    my @res = &service.();
    say @res.shift => @res.hash;
}

class nginx::install {
	my $nginxparams = "nginx";
	service { "$nginxparams":
        conf => "#",
        source => "http" 
    }
}

运行结果如下:

perl6 /data/perl6/script/puppet-style.pl
"nginx" => {"conf" => "#", "source" => "http"}

当然实际上 puppet 要复杂很多,这里其实更多是为了说明 Perl6 如何自定义操作符~