拼音的声调表示

sunnavy
2010-09-11 12:39:11 +0000

前几天写文章的时候突然发现不能很方便地输入拼音的声调,所以写了个小模块来干这件事。

用法很简单,下面是一个输出拼音的例子:

 use encoding 'utf8';
 use Lingua::Han::CanonicalPinYin 'canonicalize_pinyin';
 print canonicalize_pinyin( $_ ), "\n" for @ARGV;

如果输入"wen1", 就会输出"wēn",同理还可以输出"wén"(wen2),"wěn"(wen3)和"wèn"(wen4)

Perl6之九 - cross and zip operators

sunnavy
2010-07-26 06:06:44 +0000

二者都是元运算符(metaoperator),参数均为列表。

corss的符号是X,后接一个二元运算符,操作类似于集合中的笛卡尔积。

zip的符号是Z,后接一个二元运算符,与corss的区别见例子

e.g.

 1,2 X+ 3,4     # (1+3, 1+4, 2+3, 2+4), i.e. 4, 5, 5, 6
  X~  # 'ac', 'ad', 'bc', 'bd'

 1,2 Z+ 3,4     # (1+3, 2+4), i.e. 4, 6
  Z~  # 'ac', 'bd'

Perl6之二 - sigil

sunnavy
2010-07-25 04:52:39 +0000

与Perl5很不相同的是,sigil不会变化,scalar永远是$,array永远是@,hash永远是%。

e.g.

Perl6:

 my $scalar = [1,2,3];
 $scalar[0];     # return 1
 my @array = (1,2,3);
 @array[0];      # return 1
 my %hash = ( one => 1, two => 2 );
 %hash;      # return 1, equal to %hash{'one'}

等价的Perl5:

 my $scalar = [1,2,3];
 ${$scalar}[0];     # return 1
 my @array = (1,2,3);
 $array[0];      # return 1
 my %hash = ( one => 1, two => 2 );
 $hash{one};      # return 1

同时,sigil的意思也扩展了:

@x可以绑定任何实现了Positional role的对象,%x对应Associative,%&x对应Callable,::x对应Abstraction。$x没有对应的role,所以可以绑定任何对象.

另外,Perl6还增加了secondary sigil (twigil),以用来指代不同作用域的变量:

 $.foo       # object attribute public accessor
 $^foo       # self-declared formal positional parameter
 $:foo       # self-declared formal named parameter
 $*foo       # dynamically overridable global variable
 $?foo       # compiler hint variable
 $=foo       # Pod variable
 $\      # match variable, short for $/{'foo'}
 $!foo       # object attribute private storage
 $~foo       # the foo sublanguage seen by the parser at this lexical spot

Perl6之一 - 注释

sunnavy
2010-07-25 00:12:54 +0000

除了在引号里,"#"总是意味着注释,所以不能再像Perl5一样用作分隔符:

 qq#ok#    # wrong in Perl6

Perl6增加了内嵌注释:

'#`'后跟一对括号

e.g.

 say #`( I'm a comment ) "howdy world"
 say #`(( I'm a comment too )) "howdy world"
 say #`[ I am another comment] "howdy world"
 say #`{{
    multiple line comments
 }} "howdy world"

App::moduleshere

sunnavy
2010-04-23 21:26:25 +0000

used to copy module files(.pm) in @INC to current working directory or somewhere.

it's on CPAN

Perl第二纪

sunnavy
2010-04-21 14:35:52 +0000

昨天JT Smith发表了一篇博文: the second age of perl,宣称Perl 5的第二纪已经开始, 如下是此文的翻译.

Perl的第二纪

多少年了,人们一直在说,Perl已经死了或者说正在死。 我甚至也这么说过,虽然我的意思和字面上的并不一样。

今天我自作主张在此宣布,我们已经在Perl的第二纪了,不过这和Perl 6没有关系!

这并不是说我不喜欢Perl 6/Rakudo,实际上我很喜欢,只是现在我还并不依赖它工作。Perl 5是我们现在所依赖的,我想这种情况还将持续好些年。

我们进入第二纪其实已经有段日子了,只是没有意识到罢了。Tatsuhiko Miyagawa, Ovid, Brian Foy, Stevan Little, MST, DaveRolsky,还有好些巨人(当然,也不能忽略我们这些小人物的贡献,我是说整个社区),他们的工作(以Class::MOP, Perl::Critic, DBIx::Class, DateTime, and Moose作为开端)构成了第二纪的基础。真正带领我们进入第二纪的是在这些基础之上创造的新东西,比如Padre, Plack, MooseX,Mojolicious和Dancer,还有cpanminus,Starman和Dist::Zilla,更别说Strawberry Perl了。

我坐在这里写这篇文章的时候,脑袋里充满了我能列出来的模块和程序,但是第二纪并不只是代码。它也包括各种各样的推广比如PerlBuzz,blogs.perl.org以及Ironman Blogathon,还包括世界各地数不清的YAPC和MiniYAPC。这是Perl Mongers的再次振兴,这是新的Task::*规则,这是新的Perl 5.12的发布规则。这也是Enlightened Perl之类正在做的。

我们现在正在未来的悬崖边上,自然不能吃老本,但是可以抽点时间来赞美一下在过去这几年里我们所做出的成绩。我们成功避免了成为“过时语言”的危险,并且再次成为主流。是时候该做更多的创新了,是时候去创造一些让Ruby,Python和其他语言想抄的工具和应用了。这就是Perl的正则表达式成为事实标准的原因,也是这些语言极力想建立自己的“CPAN”的原因。让我们做更多的创新让它们去抄吧。

Perl6之十六 - closure traits

sunnavy
2006-12-07 16:54:03 +0000

``trait"是一个比较新的词汇(起码对于我来说),Perl6里有好几个地方都用到这个词。中文直译过来是“特性”,我觉得也差不多是这个意思。通常在说明一个东西某方面的性质时便会用到这个词。在OO中,我们还将看到这个词。

之前我们看到的CATCH block就是它所在的block的一个trait。此外还有好些,比如BEGIN, INIT,LEAVE,NEXT,END等等都是block traits

之前说的Perl6中模拟Perl5 continue {}便可以使用NEXT block来完成

Perl6之十五 - exception

sunnavy
2006-12-06 16:08:05 +0000

先说一下eval。Perl5中的eval接受两种参数,一个是EXPR,一个是BLOCK。Perl6中eval只接受前一种形式(EXPR),后一种形式将有个新名字try。

Perl6的exception和别的语言不太一样。对于一个block,如果你需要进行异常处理,那么就在这个block里面放上一个CATCH block(其实它也是个closure trait)。

异常处理其实是个switch语句,只不过这里的主题是那个异常对象(Exception object)$!(还记得么?之前说过switch是个主题化的方法)

Perl6之十四 - switch

sunnavy
2006-12-05 16:20:29 +0000

Perl6将有``switch"语句,但keyword可不是switch和case,而是given和when。因为``switch"其实一种主题化(topicalizing,语言学里的概念)的方法。

e.g.

 given EXPR {
     when EXPR { ... }
     when EXPR { ... }
     default { ... }
 }

when后面跟的EXPR是smart match(更强大的模式匹配)。given block里并不要求全是when。

跟C语言的switch还有一个很大的不同:在满足一个条件,执行完对应的语句后就直接退出given block,而不是向下继续执行。(还记得在C语言的switch里我们要写多少break么?呵呵)。

Perl6之十三 - loop

sunnavy
2006-12-04 17:06:58 +0000
  1. continue block没有了。

新方法:在loop block里放一个NEXT block(其实是个closure trait,以后会讲,;-)

  1. do while没有了。

改用repeat while。跟do while不同的是,repeat while可是真正的loop block,因此可以使用next, last,redo等等。

e.g.

 repeat {
     say 'bla,bla';
 } while $foo > 0;

还可以这样:

 repeat while $foo > 0 {
     say 'bla,bla';
 }

do {} 这种形式将被当做do-once loop,和Perl5中的bare block等价。

  1. for分叉了。

类似于C中的for的用法被loop取代,for只有剩下的那一种意思(即和foreach等价),于是,foreach就被舍弃了(我不用foreach已经很多年了,嘿嘿)。

Perl6之十二 - if

sunnavy
2006-12-03 18:02:16 +0000

if和Perl5里的基本没什么区别,除了在Perl6中条件部分的括号可以省略了。其实不止if,绝大部分控制语句中相应的“条件部分”的括号都可以省略了。

e.g.

 if $foo eq 'Bilbo' {
     say 'Bilbo loves smoke-rings';
 }

Perl6之十一 - block

sunnavy
2006-12-02 16:05:56 +0000

我们最常看到的block就是被{}包起来的那部分,一个文件也是一个block。block都是闭包(closure)。

在block里声明的lexical变量(比如my声明的)不会泄漏到block外面去(除非你做一些手脚)。

Perl5里的local函数被改名作temp,而且行为上还有些细微差别:temp声明时不会undef变量。

e.g.

 $_ = 3;
 {
     temp $_;    # $_ still is 3
 }

Perl6里增加了一个let函数,和temp基本一样,区别在于只有在block非正常退出后变量才会恢复之前的值(比如抛出异常,Scalar环境中返回undef),否则将会保持这个新值。

Perl6之十 - feed operator

sunnavy
2006-12-01 16:28:13 +0000

feed operator就像UNIX里的管道(pipe),只不过这个管道里面流的是列表。符号是==>或==

e.g.

 @result = map { floor( $^x / 2 ) },     # It's Perl6 where comma is needed.
           grep {/^ \d+ $/},             # so is this
           @data;

也可以这样写:

 @result == map { floor( $^x / 2 ) }
         == grep {/^ \d+ $/}
         == @data;

或者这样:

 @data ==> grep {/^ \d+ $/}
       ==> map { floor( $^x / 2 ) }
       ==> @result;

Schwartzian Transform应该能用的上这个,;-)

Perl6之九 - cross operator(obsolete)

sunnavy
2006-11-30 15:49:10 +0000
newer version is here

cross operator也是metaoperator的一种。符号是XX参数为列表,对它们进行permutation操作,类似于集合中的笛卡尔积。

e.g.

 1,2 X+X 3,4     # (1+3, 1+4, 2+3, 2+4), i.e. 4,5,5,6
  X~X  # 'ac', 'ad', 'bc', 'bd'

Perl6之八 - reduction operator

sunnavy
2006-11-29 16:46:17 +0000

reduction operator也是metaoperator。符号是[],作用有点像FP中的fold函数。

e.g.

 [+] 1,2,3       # 1+2+3, so we get 6
 [-] 1,2,3       # 1-2-3, get -4
 [~] 'foo','bar' # 'foo' ~ 'bar', get 'foobar'
 [] 1,2,3       # 1  2  3, get True;

Perl6之七 - hyper operator

sunnavy
2006-11-28 16:44:17 +0000

首先解释一下metaoperator。就我的理解,它就是可以和别的运算符一起协作来干些事情的运算符。

今天要说的Hyper运算符就属于metaoperator

符号是>>或者,它对列表中的每一个元素在标量环境中操作,返回新生成的列表。e.g.

- (1,2,3) # (-1,-2,-3)

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

Perl6之六 - binding operator

sunnavy
2006-11-27 16:16:44 +0000

binding发音像绑定,意思也差不多,其实就是别名(alias)。

e.g.

 my $x = 'foo';
 my $y := $x;
 $y = 'bar';
 say $x;         # 'bar'
 
 ::= 和 := 类似,不过它是在编译的时候就绑定的。
 
 =:= 像 == ,但它是用来检查两者是否绑定在同一个东西上。

Perl6之五 - 运算符之三

sunnavy
2006-11-26 17:05:59 +0000

3. 一些新的运算符

  • xx

类似x,但xx生成一个列表(list)而非一个字符串(string)

e.g.

 'a' xx 3        # ('a','a','a')
 3 xx 3          # (3,3,3)
 (1,2,3) xx 3    # (1,2,3,1,2,3,1,2,3)
  • ...> 和 ...>>

...>和qw{...}作用相同。...>和...>>的区别在于...>不会内插,而...>>会。

e.g.

 $_ = 'foo';
 my %hash = ( '$_' => 3, 'foo' => 'bar' );
 say %hash$_>;       # 3
 say %hash$_>>;     # 'bar'
  • //

和||类似,不过它检查左边操作数是否定义而非真假。就像||有or,&&有and,//有err

e.g.

 0 // 1          # 0
 undef // 1      # 1
  • ^^

就是高优先级的xor

Perl6之四 - 运算符之二

sunnavy
2006-11-25 17:47:08 +0000

2. 一些意义发生变化的运算符

  • ,

生成列表(list)e.g.

 @foo = 1,2,3    # (1,2,3)
  • ..

生成Range对象(以后会解释)e.g.

 1..2
  • ^

生成一个从0开始直到它的参数为止(不包括该参数)的Range对象。e.g.

 ^4              # 0..3
  • =>

将生成Pair对象(以后会解释)e.g.

 foo => 'bar'
  • + ~ ?

meta operator。

 +表明是数字环境,~表明是字符串环境,?表明是布尔环境。

Perl6之三 - 运算符之一

sunnavy
2006-11-24 16:52:45 +0000

运算符(operators)就是函数(functions),虽然它们可能长得怪了点。

1. Perl5中原有的一些运算符的新形式:

 Perl5     Perl6
 ${}        $()
 @{}        @()
 %{}        %()
 ->         .
 .          ~               # string concatenation
          +
 >>         +>
 ? :        ?? !!
 ..         ff              # flipflop
 ...        fff
 cmp        leg
 
 #bitwise operators
 |          +| for numbers, ~| for strings, ?| for bools
 &          +&              ~&              ?&
 ^          +^              ~^              ?^
 ~          +^              ~^              ?^        # not typo

注意:

  • ?|是逻辑或,不会短路,它相当于 ?$a + ?$b != 0
  • ?&是逻辑与,不会短路,它相当于 ?$a * ?$b != 0

Perl6中比较算符可以连接起来了,比如 3 $foo 10

1 2