perl6 hyper 操作符 原创

perl6 hyper 操作符 原创

前两天写的东西,看来大家响应还是很积极的。今天讲一讲perl6 元操作符的一个:hyper 操作符。

什么是hyper操作符呢? 官方解释:所有>>, <<(包括uinicode),用来对一个list中的所有元素做某一操作,并返回一个list.

唔,类似 perl5 中的map,不过更强大。现在我们可以来看看hyper操作符的强大功能:

(1,2,3,4)>> +<<(1, 2, 3, 4)  #(2, 4, 6, 8)

(1, 2, 3, 4) >>+ >>1                       #(2, 3, 4, 5) 注意hyper操作符的方向!!

(1, 2, 3, 4) >>++                            # 同上!

@PP >>+=                                     #  @PP所有元素自增1

如果hyper操作符两边有一个属于scalar(在perl6 中也叫item),perl6会自动强制转换,但是前提是hyper操作符的方向应指向该元素。(见例2)

在 perl6里面, 方法可以近似看做“后操作符”. (注:perl6的操作符分为 prefix op, infix op, 和 postfix op。有兴趣的人可以查看syn,我这里就不扯远了),所以当然可以这样使用:

(1, 2, 3, 4). >>++                  #同上
(1, 2, 3, 4) >> .++                          #同上
稍微巧妙一点:
@objects >> .run                            #顺序执行run
("a", "bb", "ccc") >> .char               # (1, 2, 3)

hash也是一种list,所以也可以使用hyper操作符。不过是以key作为项的,而且hyper符的方向起到了类似sql语句中左包含,右包含的作用。见下例:

%a >>+<< %b                                 #既包含%a 又 包含%b的元素才相加
%a <<+>>%b                                  # 全包含
%a >>+>>%b                                  # 包含%b
%a <<+<<%b                                  # 包含%a

好了,上面展示了一些hyper操作符的基本应用。大家可以多试试,或者查看文档,好好领会perl6中新的操作符。

p.s.  
回答一些上次大家提的问题:
1. 因为那句著名的圣诞节宣言, perl6开发人员正在努力赶工。  ;)
2. pugs 看上去差不多停滞了, rakudo倒是很积极, 0.70下个月初发布。
3. parrot 基本的io也差不多了, 我们至少可以用perl6 来写个简单的cat:

my $fh = open("README", :r);
for =$fh {
    say " $_";
}
$fh.close();

[[i] 本帖最后由 xiaoyafeng 于 2008-4-28 12:54 编辑 [/i]]
把表情去一下。
倒, 看来稍微复杂一点就无人问津了。
我来顶你
重新学语法让我有点苦闷
perl6会不会比perl5慢?
昨晚看了点haskell
完全不懂
跟Lisp啥的差不多
(1,2,3,4)>> +<<(1, 2, 3, 4)  #(2, 4, 6,

(1, 2, 3, 4) >>+ >>1                       #(2, 3, 4, 5) 注意hyper操作符的方向!!

(1, 2, 3, 4) >>++                            # 同上!


太帅了!
哦,此帖不错,路过顶一下!~
谢谢,回家侃侃哈