拼音的声调表示
前几天写文章的时候突然发现不能很方便地输入拼音的声调,所以写了个小模块来干这件事。
用法很简单,下面是一个输出拼音的例子:
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
二者都是元运算符(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
与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之一 - 注释
除了在引号里,"#"总是意味着注释,所以不能再像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
used to copy module files(.pm) in @INC to current working directory or somewhere.
it's on CPAN
Perl第二纪
昨天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
``trait"是一个比较新的词汇(起码对于我来说),Perl6里有好几个地方都用到这个词。中文直译过来是“特性”,我觉得也差不多是这个意思。通常在说明一个东西某方面的性质时便会用到这个词。在OO中,我们还将看到这个词。
之前我们看到的CATCH block就是它所在的block的一个trait。此外还有好些,比如BEGIN, INIT,LEAVE,NEXT,END等等都是block traits
之前说的Perl6中模拟Perl5 continue {}便可以使用NEXT block来完成
Perl6之十五 - exception
先说一下eval。Perl5中的eval接受两种参数,一个是EXPR,一个是BLOCK。Perl6中eval只接受前一种形式(EXPR),后一种形式将有个新名字try。
Perl6的exception和别的语言不太一样。对于一个block,如果你需要进行异常处理,那么就在这个block里面放上一个CATCH block(其实它也是个closure trait)。
异常处理其实是个switch语句,只不过这里的主题是那个异常对象(Exception object)$!(还记得么?之前说过switch是个主题化的方法)
Perl6之十四 - switch
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
- continue block没有了。
新方法:在loop block里放一个NEXT block(其实是个closure trait,以后会讲,;-)
- 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等价。
- for分叉了。
类似于C中的for的用法被loop取代,for只有剩下的那一种意思(即和foreach等价),于是,foreach就被舍弃了(我不用foreach已经很多年了,嘿嘿)。
Perl6之十二 - if
if和Perl5里的基本没什么区别,除了在Perl6中条件部分的括号可以省略了。其实不止if,绝大部分控制语句中相应的“条件部分”的括号都可以省略了。
e.g.
if $foo eq 'Bilbo' {
say 'Bilbo loves smoke-rings';
}
Perl6之十一 - block
我们最常看到的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
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)
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
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
首先解释一下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
binding发音像绑定,意思也差不多,其实就是别名(alias)。
e.g.
my $x = 'foo'; my $y := $x; $y = 'bar'; say $x; # 'bar' ::= 和 := 类似,不过它是在编译的时候就绑定的。 =:= 像 == ,但它是用来检查两者是否绑定在同一个东西上。
Perl6之五 - 运算符之三
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之四 - 运算符之二
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之三 - 运算符之一
运算符(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
