扶 凯 2011年09月27日 - 15:06
10

打开第二个 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/


10 Comments

  1. 陈子说道:

    [root@localhost ~]# perl -MPerl6::Say -e ‘say ” “x (9-$_),”#”x($_*2-1) for 0..9,2,2,2′

    #
    ###
    #####
    #######
    #########
    ###########
    #############
    ###############
    #################
    ###
    ###
    ###
    这里除了新增的xx操作符以外,还告诉我们x操作符和+-*/的优先级也有变化了么~perl5里不加括号接过不对。

  2. admin说道:

    看起来是,x 操作符的优先级感觉下降了。

  3. 陈子说道:

    是高了吧。
    另:发现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

  4. Nam说道:

    感到宾至如归啊——

  5. Nam说道:

    发现太多有意思的东西了。很有兴趣。

  6. xfoo说道:

    自己尝试后。。
    泪牛满面啊。。
    谢谢啦 。。

  7. ladiu说道:

    非常有用。谢谢。

  8. p说道:

    太有趣了。
    Perl6。研究研究。

  9. apestry说道:

    很清楚,不错。

  10. xnxn说道:

    学习一下

Add New Comment