打开第二个 Advent 中礼物给你所带来的是 Perl 6 的是什么啦?那就是 …. 方法名 .fmt
如果你了解 sprintf ,你会对 .fmt 感到宾至如归.如果你之前还从没有听说过的sprintf,或者如果你听说过,但有只了解一点模糊的细节,您可能要略读一下 perldoc .但不要被大量说明所淹没,尽管它的稍长.你得只要细细品味.
回到 .fmt , 这个是 sprintf 它的妹妹.下面有几个使用 .fmt 来格式化字符串和整数的方法
say 42.fmt('%+d') # '+42'
say 42.fmt('%4d') # ' 42'
say 42.fmt('%04d') # '0042'
say :16<1337f00d>.fmt('%X') # '1337F00D'
这些功能不错,很好,但这不就是一个比较短的 sprintf 的方法的形式吗.有什么了不起的,对不对?
我还没有告诉你的是,.fmt是可以重载的,可以工作在一个 array 上(或更确切地说是列表).
say <huey dewey louie>.fmt # 'huey dewey louie'
say <10 11 12>.fmt('%x') # 'a b c'
say <1 2 3>.fmt('%02d', '; ') # '01; 02; 03'
同样地,也可以重载用于 hash(或更确切地说是 map)
say { foo => 1, bar => 2 }.fmt # 'foo 1
# bar 2'
say { Apples => 5, Oranges => 10 }.fmt('%s cost %d euros')
# 'Apples cost 5 euros
# Oranges cost 10 euros'
say { huey => 1, dewey => 2, louie => 3 }.fmt('%s', ' -- ')
# 'huey -- dewey -- louie'
上述所显示的 hash 的输入,可能和你的输出的顺序并不一样.这的 .fmt 重载是工作在 hash 对上.它工作起来类似操作哈希的其中之一.
当你想对数组或哈希的输出的值改变成定制的格式时..fmt 是一个非常有用的小工具.它非常象sprintf,但也非常适合操作你的数组和哈希.
这个功能的只有一个“风险”:那就是有人会认为 Perl 家族中的 Perl 6 又是一种不可读,不清晰的语言.为了对付这种风险,我留下一个小临别礼物,使用 Perl 6 打印一个简单密实的圣诞树.
$ perl6 -e 'say " "x 9-$_,"#"x$_*2-1 for 0..9,2 xx 3'
#
###
#####
#######
#########
###########
#############
###############
#################
###
###
###
[*] 如果你是 windows 你需要修改引号如下
c:\>perl6.exe -e "say ' 'x 9-$_,'#'x$_*2-1 for 0..9,2 xx 3"
注:很可惜好象目前最新的 Rakudo 是没法执行这个小临别礼物.进行了参数的强化所以我进行了小小的修改,来实现上面的功能
$ say " " x 9-$_,"#"x $_*2-1 for 1..9, 2 xx 3
本文为译文 By carl: http://perl6advent.wordpress.com/2009/12/02/day-2-the-beauty-of-formatting/
[root@localhost ~]# perl -MPerl6::Say -e ‘say ” “x (9-$_),”#”x($_*2-1) for 0..9,2,2,2′
#
###
#####
#######
#########
###########
#############
###############
#################
###
###
###
这里除了新增的xx操作符以外,还告诉我们x操作符和+-*/的优先级也有变化了么~perl5里不加括号接过不对。
看起来是,x 操作符的优先级感觉下降了。
是高了吧。
另:发现x操作符要求左右空格啊——
[root@AY110907102215177d47d ~]# perl -e ‘print 2 x 3′
222[root@AY110907102215177d47d ~]# perl6 -e ‘print 2×3′
===SORRY!===
Confused at line 1, near “print 2×3″
[root@AY110907102215177d47d ~]# perl6 -e ‘print 2+3′
5
感到宾至如归啊——
发现太多有意思的东西了。很有兴趣。
自己尝试后。。
泪牛满面啊。。
谢谢啦 。。
非常有用。谢谢。
太有趣了。
Perl6。研究研究。
很清楚,不错。
学习一下