2010年12月18日星期六

[PerlChina] 2010 Perl Advent Day 18: Perl::Tidy 和 Perl::Critic

http://advent.perlchina.org/2010/Tidy_A_Critic.html

=for advent_year 2010

=for advent_day 18

=for advent_title Perl::Tidy 和 Perl::Critic

=for advent_author Fayland Lam

我觉得我没能在去年或者今年的第一天介绍 M<Perl::Tidy> 和 M<Perl::Critic> 是我的过错。

有些人喜欢 Python 的缩进风格,觉得 Perl 太随意了,你可以将 ; 放在一行最前面或者最后面。你可以将一大堆 Perl
代码堆积在一行里。他们觉得阅读 Perl 的代码很累。当然,这并不是 Perl 的错。

使用 M<Perl::Tidy>
的理由可以有很多,比如你接手了前同事的代码,而他的风格跟你相差甚远。或者你希望你的团队能保持一个风格,但是你又不想强迫队员去更改代码的编写习惯。

M<perltidy> 的使用很简单,您可以使用它的模块,或者简单的命令行

=begin pre

$ perltidy test.pl

=end pre

大部分情况下你可能只需要默认的配置选项,但是如果你觉得对什么不满意的话,你可以创建自己的 ~/.perltidyrc 文件。或者直接去
Google 搜索 .perltidyrc

另外一个有用的 options 是 --html 可以创建一个简单的加亮 html 文件。

=begin pre

$ perltidy --html test.pl

=end pre

另一个模块是 M<Perl::Critic>, 该模块的大部分 policy 都基于 Damian Conway 的 Perl Best
Practices (Perl 最佳实践) 一书。

M<perlcritic> 的使用也是很简单,您可以使用模块本身,或者简单的命令行

=begin pre

$ perlcritic -5 test.pl

=end pre

当然,如果你对某个 policy 不喜欢,或者你仅仅需要某些 policy 或额外的 policy,你可以拥有自己的 ~/.perlcriticrc

试着尝试它们,让您的代码更具有可读性和更少的 bug。

Enjoy!
--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

2010年12月17日星期五

[PerlChina] 2010 Perl Advent Day 17: 使用 Perl 实现小语言

http://advent.perlchina.org/2010/compiling.html (from agentzh)

=for advent_year 2010

=for advent_day 17

=for advent_title 使用 Perl 实现小语言

=for advent_author agentzh

日常工作中,我们经常会注意到可以发明一种小语言,来简化复杂问题的描述。此时,我们
需要做一个编译器,以便把我们自己的小语言翻译成机器可以理解的形式,比如某种高级
语言,甚至只是一个复杂的数据结构的序列化形式。

编译器一般由三部分构成:

=over

=item 语法/词法解析器 (Parser)

在 Perl 5 中,构造编译器最方便的利器之一便是 Damian Conway 的 Parse::RecDescent
模块。它在 CPAN 上拥有非常详尽的用法文档。

它生成的解析器是支持回溯的"递归下降"方式,具体细节请参考编译理论方面的书籍。

一个 SQL 语言的文法定义片段,使用 Parse::RecDescent 的语法类似下面这个样子:

=begin code

select_query: 'select' distinct(?) select_arg(s /,/)
from_clause(?)
where_clause(?)
group_by_clause(?)
order_by_clause(?)
limit_clause(?)
{ SQL::SelectQuery->new({ ... }) }
| <error>

=end code

但此模块的性能并不出色,对于大量的文本解析会花费较多的时间。此时,yacc 风格的
Parse::Yapp 模块可以让性能大幅提升,但它的功能就远没有 Parse::RecDescent
丰富和灵活了,因为它生成的解析器是标准的 LALR(1) 分析。

=item 解析树/抽象语法树 (AST)

使用简单的嵌套数组或者哈希对象可以在 Perl 5 中很好地表达简单的树形结构。但为了
后序的操作方便,我们会选择 Moose 来定义一套类似 DOM 的节点类。不过值得提醒的是,
使用 Moose 是有代价的,它会让你的纯 Perl 5 编写的编译器花费更多的时间来启动。

最近几年,Moose 的粉丝越来越多,或许你在自己的小编译器中也可以小试牛刀 ;)

比如对于一个类 SQL 的小语言,其二元运算符表达式的 AST 节点可以用 Moose 定义如下:

=begin code

package SQL::BinaryRelExpr;
use Moose;
use lib 'lib';
use SQL::ArithExpr;

extends 'SQL::RelExpr';

has 'terms',
is => 'rw',
isa => 'ArrayRef[SQL::ArithExpr]',
required => 1;

has 'operator',
is => 'rw',
isa => 'Str',
required => 1;

...

1;

=end code

=item 代码生成器 (Code Emitter)

很多时候,我们直接写 Perl 5 代码来遍历 AST 就可以直接生成目标代码(或者说最终
想要的文本)。但还有一些场合,特别适合使用 Perl Template Toolkit (TT2) 来
作模版驱动的代码生成。谁说 TT2 模版只能用来生成 HTML 和 XML? 我们经常在自己
的工作中使用 TT2 模版来生成 Lua, C, 甚至 Perl ;)

把"写程序的程序"的革命进行到底!

=back

Perl 6 为编译器的构造提供了语言级别的完美支持。我们不必再求助于第三方模块来
实现自己的小语言了。Perl 6 的 regex 引擎已经强大到足以解析像 Perl 6 本身
这样复杂的语言的文法了。小语言的未来更值得期待!

--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] 作了一个天气桌面,欢迎测试

我没有找到这个包阿

2010/12/17 wd <wd@wdicc.com>
LWP/Simple.pm ....
LWP::Simple

在 2010年12月17日 下午1:23,Du Wayne <cn.duwei@gmail.com>写道:
LWP/Simple.pm

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] Re: 作了一个天气桌面,欢迎测试

Win32下应该可以的,但是我用PPM装了GTK2,启动的时候说libpango.dll出问题,但是装GTK2的时候没有depends on pango

2010/12/17 CGI.NET <loveme1314@gmail.com>
呵呵,可惜不支持WINDOWS

--
>: ~

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] 作了一个天气桌面,欢迎测试

老乡你好!

在 2010年12月17日 下午12:52,cnhack TNT <cnhacktnt@gmail.com>写道:
cool, 长沙的?我也是 :-)

2010/12/17 eexpress <eexp01@gmail.com>

http://code.google.com/p/cairo-weather/
纯cairo的。


--
使用 Opera 革命性的电子邮件客户程序: http://www.opera.com/mail/

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。


--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。



--
HY_CN

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

[PerlChina] Re: 作了一个天气桌面,欢迎测试

呵呵,可惜不支持WINDOWS

On 12月17日, 上午10时51分, eexpress <eex...@gmail.com> wrote:
> http://code.google.com/p/cairo-weather/
> 纯cairo的。
>
> --
> 使用 Opera 革命性的电子邮件客户程序:http://www.opera.com/mail/

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

[PerlChina] Re: 作了一个天气桌面,欢迎测试

借问project页面上的的截图里的输入法是啥输入法?

On Dec 17, 10:51 am, eexpress <eex...@gmail.com> wrote:
> http://code.google.com/p/cairo-weather/
> 纯cairo的。
>
> --
> 使用 Opera 革命性的电子邮件客户程序:http://www.opera.com/mail/

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

2010年12月16日星期四

Re: [PerlChina] 作了一个天气桌面,欢迎测试

我也是啊

在 2010年12月17日 下午1:23,Du Wayne <cn.duwei@gmail.com> 写道:
> Can't locate LWP/Simple.pm in @INC (@INC contains: /usr/lib/perl5/site_perl
> /usr/share/perl5/site_perl /usr/lib/perl5/vendor_perl
> /usr/share/perl5/vendor_perl /usr/lib/perl5/core_perl
> /usr/share/perl5/core_perl /usr/lib/perl5/site_perl/5.10.1
> /usr/share/perl5/site_perl/5.10.1 /usr/lib/perl5/current
> /usr/lib/perl5/site_perl/current .) at ./cairo-weather.pl line 24.
>
> 我这是缺那个依赖包?
>
> 2010/12/17 cnhack TNT <cnhacktnt@gmail.com>
>>
>> cool, 长沙的?我也是 :-)
>>
>> 2010/12/17 eexpress <eexp01@gmail.com>
>>>
>>> http://code.google.com/p/cairo-weather/
>>> 纯cairo的。
>>>
>>>
>>> --
>>> 使用 Opera 革命性的电子邮件客户程序: http://www.opera.com/mail/
>>>
>>> --
>>> 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
>>> 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
>>> 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
>>> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>>>
>>
>> --
>> 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
>> 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
>> 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
>> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>
> --
> 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
> 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
> 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] 作了一个天气桌面,欢迎测试

LWP/Simple.pm ....
LWP::Simple

在 2010年12月17日 下午1:23,Du Wayne <cn.duwei@gmail.com>写道:
LWP/Simple.pm

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] 作了一个天气桌面,欢迎测试

Can't locate LWP/Simple.pm in @INC (@INC contains: /usr/lib/perl5/site_perl /usr/share/perl5/site_perl /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5/core_perl /usr/share/perl5/core_perl /usr/lib/perl5/site_perl/5.10.1 /usr/share/perl5/site_perl/5.10.1 /usr/lib/perl5/current /usr/lib/perl5/site_perl/current .) at ./cairo-weather.pl line 24.

我这是缺那个依赖包?

2010/12/17 cnhack TNT <cnhacktnt@gmail.com>
cool, 长沙的?我也是 :-)

2010/12/17 eexpress <eexp01@gmail.com>

http://code.google.com/p/cairo-weather/
纯cairo的。


--
使用 Opera 革命性的电子邮件客户程序: http://www.opera.com/mail/

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。


--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] 作了一个天气桌面,欢迎测试

cool, 长沙的?我也是 :-)

2010/12/17 eexpress <eexp01@gmail.com>
http://code.google.com/p/cairo-weather/
纯cairo的。


--
使用 Opera 革命性的电子邮件客户程序: http://www.opera.com/mail/

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。


--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

[PerlChina] 作了一个天气桌面,欢迎测试

http://code.google.com/p/cairo-weather/
纯cairo的。


--
使用 Opera 革命性的电子邮件客户程序: http://www.opera.com/mail/

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

2010年12月15日星期三

Re: [PerlChina] 2010 Perl Advent Day 16: Rmap

多谢

在 2010年12月16日 上午8:31,Fayland Lam <fayland@gmail.com>写道:
http://advent.perlchina.org/2010/Rmap.html

=for advent_year 2010

=for advent_day 16

=for advent_title Data::Rmap

=for advent_author Fayland Lam

有时候你有一个很复杂的数据结构,比如我们的 M<Catalyst> M<YAML> 配置文 件。有时候你会有一个很奇特的要求,比如我们的某台服务器没有私有 IP,所以 需要对这个 YAML 里的所有 IP 进行转换。

解决的方案有很多种。下面是一个很简单实用的方案(使用 M<Data::Rmap>):

=begin code

use Data::Rmap;
rmap { s/192\.168\.1/xx\.xxx\.xxx/; s/192\.168\.2/xx\.xxx\.yyy/; } $config;

=end code

2 行代码解决问题。这就是 CPAN 的魅力所在。

题外话:我觉得 advent 并不能给诸位带来多大的提高或者什么,它最大的作用在 于扩展视野。如果诸位下次碰到问题,比如对某个数据结构进行迭代 map 的时 候,能想起今天推荐的模块,那就是 advent 的最大成功。

谢谢。

--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。


--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

[PerlChina] 2010 Perl Advent Day 16: Rmap

http://advent.perlchina.org/2010/Rmap.html

=for advent_year 2010

=for advent_day 16

=for advent_title Data::Rmap

=for advent_author Fayland Lam

有时候你有一个很复杂的数据结构,比如我们的 M<Catalyst> M<YAML> 配置文
件。有时候你会有一个很奇特的要求,比如我们的某台服务器没有私有 IP,所以
需要对这个 YAML 里的所有 IP 进行转换。

解决的方案有很多种。下面是一个很简单实用的方案(使用 M<Data::Rmap>):

=begin code

use Data::Rmap;
rmap { s/192\.168\.1/xx\.xxx\.xxx/; s/192\.168\.2/xx\.xxx\.yyy/; } $config;

=end code

2 行代码解决问题。这就是 CPAN 的魅力所在。

题外话:我觉得 advent 并不能给诸位带来多大的提高或者什么,它最大的作用在
于扩展视野。如果诸位下次碰到问题,比如对某个数据结构进行迭代 map 的时
候,能想起今天推荐的模块,那就是 advent 的最大成功。

谢谢。

--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

2010年12月14日星期二

[PerlChina] 2010 Perl Advent Day 15: Parallel::Scoreboard

Hi All,

Day 15 这篇介绍的是 Parallel::Scoreboard,你可以在以下地址阅读:


http://advent.perlchina.org/2010/scoreboard.html  (这个会同步上面的内容, 但有时可能因为网络原因会有些小问题,还是以上面的为准)


谢谢!

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

[PerlChina] 2010 Perl Advent Day 14: Class::XSAccessor

http://advent.perlchina.org/2010/XSAccessor.html
or http://fayland.github.com/advent.perlchina.org/2010/XSAccessor.html

=for advent_year 2010

=for advent_day 14

=for advent_title Class::XSAccessor

=for advent_author Fayland Lam

创建所谓的 accessor 应该是件很普遍的事情,对于对象来说,大部分的属性都是 accessor. 因为这个功能的普遍性,CPAN
上大概有超过 20 个模块可以完成这个任务。其中最有名的应该是 M<Moose>, M<Mouse> 或者是 mst 刚开发的更轻量级的
M<Moo>. 或许大家用过的有 M<Class::Accessor>, M<Class::Accessor::Fast> 或者
M<Class::MethodMaker>. 今天要推荐的是目前来说最快速的 M<Class::XSAccessor>.

Class::XSAccessor 最初是为了加速和简化 M<Padre> 的代码而开发,用法与其他的 accessor 模块大同小异。

=begin code

package MyClass;

use Class::XSAccessor
replace => 1, # Replace existing methods (if any)
constructor => 'new',
getters => {
get_foo => 'foo', # 'foo' is the hash key to access
get_bar => 'bar',
},
setters => {
set_foo => 'foo',
set_bar => 'bar',
},
accessors => [ 'foo', 'bar' ],
predicates => {
has_foo => 'foo',
has_bar => 'bar',
},
lvalue_accessors => { zip_code => 'zip' };
true => [ 'is_token', 'is_whitespace' ],
false => [ 'significant' ];

=end code

几个简单的解释是,

* constructor => 'new' 意味着你不用写无聊的 new 了。

* accessors => [] 是最常用的,因为大部分情况下 getter 和 setter 的名字会是一样的。

* lvalue 是个比较 fun 的功能。比如上面的设置可以有如下的测试代码

=begin code

my $address = MyClass->new(zip => 2);
print $address->zip_code, "\n"; # prints 2
$address->zip_code = 76135; # <--- This is it!
print $address->zip_code, "\n"; # prints 76135

=end code

某些极端要求速度的人,会认为 bless 一个 hashref 给 class 是件很浪费的事情,他们说应该 bless 一个
arrayref 给 class 才是正确的。这种情况下,我们可以使用 L<Class::XSAccessor::Array>, 它更给力。

当然,如果你需要说服你的上级或者你自己,你需要一个对大部分流行的 accessor 模块的
benchmark,我们也有这样的东西。简单的安装 M<App::Benchmark::Accessors>, 你就能得到你所需要的结果。

类似的结果可以参考 A<http://www.cpantesters.org/distro/A/App-Benchmark-Accessors.html>
里的 test reporters,我就不重复 copy 我自己的结果了。

Enjoy!

--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

2010年12月13日星期一

Re: [PerlChina] 2010 Perl Advent Day 13: JE

我想写个脚本查询淘宝的快递。
虽然登录方便。但是javascript有混淆。
寒假试试。放到TODO里XD

在 2010年12月13日 下午7:07,Fayland Lam <fayland@gmail.com> 写道:
> http://advent.perlchina.org/2010/JE.html
>
> =for advent_year 2010
>
> =for advent_day 13
>
> =for advent_title JE
>
> =for advent_author Fayland Lam
>
> JavaScript 是个很不错的语言。网上有一个简单的叫 ROT 13 的加密来保护 email,今天我们做一点邪恶的事,就是简单破解该加密。
>
> ROT 13 的版本有很多,不过原理是一样的。下面是一个简单的例子。
>
> php 有内置的 str_rot13,Perl 我们需要安装 M<Crypt::Rot13>
>
> =begin code
>
> use Crypt::Rot13;
>
> my $rot13 = new Crypt::Rot13;
> $rot13->charge('<a href="mailto:test@example.com">test</a>');
> print $rot13->rot13() . "\n";
>
> =end code
>
> 然后我们把它放到 html 里。
>
> =begin code
>
> <script type="text/javascript">
> Rot13 = {
> map: null,
>
> convert: function(a) {
> Rot13.init();
>
> var s = "";
> for (i=0; i < a.length; i++) {
> var b = a.charAt(i);
> s += ((b>='A' && b<='Z') || (b>='a' && b<='z') ? Rot13.map[b] : b);
> }
> return s;
> },
>
> init: function() {
> if (Rot13.map != null)
> return;
>
> var map = new Array();
> var s = "abcdefghijklmnopqrstuvwxyz";
>
> for (i=0; i<s.length; i++)
> map[s.charAt(i)] = s.charAt((i+13)%26);
> for (i=0; i<s.length; i++)
> map[s.charAt(i).toUpperCase()] = s.charAt((i+13)%26).toUpperCase();
>
> Rot13.map = map;
> },
>
> write: function(a) {
> document.write(Rot13.convert(a));
> }
> }
>
> Rot13.write('<n uers="znvygb:grfg@rknzcyr.pbz">grfg</n>');
>
> </script>
>
> =end code
>
> 你会简单的发现,html 里显示的是跟 &lt;a href="mailto:test@example.com">test&lt;/a>
> 一样的东西,但是从源代码来看是加密过的。
>
> 上面只是一个很简单的例子。很多网页上可能不是 ROT 13 加密,但是我们无需理会,强大的 M<JE> 会解决一切。
>
> JE 是由 Perl 编写的 ECMAScript 引擎。虽然非 100% 兼容,但是大部分情况下都是很好用的。
>
> =begin code
>
> use JE;
>
> my $j = JE->new;
> my $v = $j->eval(<<'JS');
> Rot13 = {
> map: null,
>
> convert: function(a) {
> Rot13.init();
>
> var s = "";
> for (i=0; i < a.length; i++) {
> var b = a.charAt(i);
> s += ((b>='A' && b<='Z') || (b>='a' && b<='z') ? Rot13.map[b] : b);
> }
> return s;
> },
>
> init: function() {
> if (Rot13.map != null)
> return;
>
> var map = new Array();
> var s = "abcdefghijklmnopqrstuvwxyz";
>
> for (i=0; i<s.length; i++)
> map[s.charAt(i)] = s.charAt((i+13)%26);
> for (i=0; i<s.length; i++)
> map[s.charAt(i).toUpperCase()] = s.charAt((i+13)%26).toUpperCase();
>
> Rot13.map = map;
> },
>
> write: function(a) {
> return(Rot13.convert(a));
> }
> }
>
> Rot13.write('<n uers="znvygb:grfg@rknzcyr.pbz">grfg</n>');
> JS
>
> print $v->value;
>
> =end code
>
> 上面的代码我们使用了一点点小技巧,我们将 document.write 转成了 return, 这样我们会得到一个
> M<JE::String> 然后通过输出 ->value 来得到真正的 &gt;a
> href="mailto:test@example.com">test&gt;/a>
>
> 上面的东西看上去有点小无聊,自己破解自己加密的东西,但是您可以使用它来解密或者运行其他的 js 代码,这都将变得非常有趣。
>
> Enjoy!
>
> --
> Fayland Lam // http://www.fayland.org/
>
> --
> 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
> 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
> 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>
>

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

[PerlChina] 2010 Perl Advent Day 13: JE

http://advent.perlchina.org/2010/JE.html

=for advent_year 2010

=for advent_day 13

=for advent_title JE

=for advent_author Fayland Lam

JavaScript 是个很不错的语言。网上有一个简单的叫 ROT 13 的加密来保护 email,今天我们做一点邪恶的事,就是简单破解该加密。

ROT 13 的版本有很多,不过原理是一样的。下面是一个简单的例子。

php 有内置的 str_rot13,Perl 我们需要安装 M<Crypt::Rot13>

=begin code

use Crypt::Rot13;

my $rot13 = new Crypt::Rot13;
$rot13->charge('<a href="mailto:test@example.com">test</a>');
print $rot13->rot13() . "\n";

=end code

然后我们把它放到 html 里。

=begin code

<script type="text/javascript">
Rot13 = {
map: null,

convert: function(a) {
Rot13.init();

var s = "";
for (i=0; i < a.length; i++) {
var b = a.charAt(i);
s += ((b>='A' && b<='Z') || (b>='a' && b<='z') ? Rot13.map[b] : b);
}
return s;
},

init: function() {
if (Rot13.map != null)
return;

var map = new Array();
var s = "abcdefghijklmnopqrstuvwxyz";

for (i=0; i<s.length; i++)
map[s.charAt(i)] = s.charAt((i+13)%26);
for (i=0; i<s.length; i++)
map[s.charAt(i).toUpperCase()] = s.charAt((i+13)%26).toUpperCase();

Rot13.map = map;
},

write: function(a) {
document.write(Rot13.convert(a));
}
}

Rot13.write('<n uers="znvygb:grfg@rknzcyr.pbz">grfg</n>');

</script>

=end code

你会简单的发现,html 里显示的是跟 &lt;a href="mailto:test@example.com">test&lt;/a>
一样的东西,但是从源代码来看是加密过的。

上面只是一个很简单的例子。很多网页上可能不是 ROT 13 加密,但是我们无需理会,强大的 M<JE> 会解决一切。

JE 是由 Perl 编写的 ECMAScript 引擎。虽然非 100% 兼容,但是大部分情况下都是很好用的。

=begin code

use JE;

my $j = JE->new;
my $v = $j->eval(<<'JS');
Rot13 = {
map: null,

convert: function(a) {
Rot13.init();

var s = "";
for (i=0; i < a.length; i++) {
var b = a.charAt(i);
s += ((b>='A' && b<='Z') || (b>='a' && b<='z') ? Rot13.map[b] : b);
}
return s;
},

init: function() {
if (Rot13.map != null)
return;

var map = new Array();
var s = "abcdefghijklmnopqrstuvwxyz";

for (i=0; i<s.length; i++)
map[s.charAt(i)] = s.charAt((i+13)%26);
for (i=0; i<s.length; i++)
map[s.charAt(i).toUpperCase()] = s.charAt((i+13)%26).toUpperCase();

Rot13.map = map;
},

write: function(a) {
return(Rot13.convert(a));
}
}

Rot13.write('<n uers="znvygb:grfg@rknzcyr.pbz">grfg</n>');
JS

print $v->value;

=end code

上面的代码我们使用了一点点小技巧,我们将 document.write 转成了 return, 这样我们会得到一个
M<JE::String> 然后通过输出 ->value 来得到真正的 &gt;a
href="mailto:test@example.com">test&gt;/a>

上面的东西看上去有点小无聊,自己破解自己加密的东西,但是您可以使用它来解密或者运行其他的 js 代码,这都将变得非常有趣。

Enjoy!

--
Fayland Lam // http://www.fayland.org/

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。