翻译两本书

接下来真的是要很忙了。有两本 Perl 的书要翻译。一本是 Effective Perl Programming,2nd Edition

另一本是 Automating System Administration with Perl,2nd Edition

还是和 cnhacktnt,joejiang 一起协作。

use base? use parent;

Perl 里面要继承某个类,一般的写法是:

use base qw/BaseClass/;

最近注意到流行用 use parent 的写法:

use parent qw/BaseClass/;

那么,区别何在?

  • parent 比 base 更轻量级。看 source 即知。
  • 如果要用 use fields; 就只能用 use base; 因为它们来自同一个 package: http://search.cpan.org/dist/base/
  • use parent; 可以用 -norequire 选项跳过寻找外部文件。

一般用起来应该没什么差别,哪个都无所谓。不过个人觉得用 parent 比较酷,嘿嘿。

Google Ads

Perl Advent

每年的最后一个月,一直到圣诞节前的 24 天,就会有大牛出来写点文章,一天一篇,叫做 Advent。最早是 perl 社区的 advent,后来 Catalyst 社区也来玩 advent。今年最热闹,下面列出几个我知道的:

怎样写 pod 文档

我想说的不是 pod 文档的格式。有关格式的可以看 perldoc perlpod 或者阅读 fayland 很久以前写的《怎么写POD》

先说动机。偷懒是天性,是事物发展的源动力,是进化的产物。写程序本身就是搞个自动干活的傀儡来反复偷懒。所以写完程序没有文档在情在理。程序员还有一个常见的现象,喜欢推到重来。因为原来写得太复杂了,就算是以前自己写的,也不能当下一眼洞穿,还不如重写更舒服。有时候这是正确和必要的,叫重构,但大多时候并不需要。

但有文档就不同,它帮你回到过去。我经常在 search.cpan.org 上看模块的用法,然后照着例子用。我最近看很久以前写的东西,朦朦胧胧,七兜八拐,晕头转向。这种情况已经不止一次了,如果有个速查手册或者简单的帮助提示,于人于己都会方便不少。

敏捷开发不提倡写文档,因为要消耗时间和精力。但这不等于走向极端化说万万不要写文档。敏捷方式提倡开始时不写,因为需求还未定型。定了型的要写,但可以简单一点。这个是时机问题,也是优先级问题。就像写 Perl 模块,开始 alpha 版本的时候可以给一个实际用例,等接口都稳定下来了再写每个方法的用法。

下面简单快速列几点:

  • 文档是写给未来自己的情书。对自己好点~
  • 文档如同性,有高潮最好,就算一般也比没有强。
  • 现在写总比以后写更快更容易,不是吗?
  • 写还是不写,想想看自己是专业的还是业余的。
  • 集中写在末尾 __END__ 下面,用 vim 的 :vs 垂直分两屏,左边代码右边文档。
  • 随时 pod2html 阅读输出版本,像用户一样读和思考。
  • 读文档的人只关心怎么用,所以写文档的目的是告诉他们怎么用;如果关心实现细节,只管由他去看源代码好了。
  • 多举例子和实际的 use case。这最直观,也最容易学用。
  • 维护 FAQ。用的人都会问些什么问题,直接列出来问答。
  • 请人来读。读不懂的地方就是白写了,立即整改。
  • 还没写的要占个位子先。这样就算出去上趟厕所心都是定的。
  • 跑个测试检查文档覆盖率。看看还有哪些位子没占到。

Changes 文件中的时间戳怎么来的

显然不应该是看了表手工打出来的。如果是以前用 UltraEdit 之类工具的话,有个快捷键可以快速插入当前时间。Changes 文件里用的时间戳一般都是这样的格式:

Tue Nov 17 18:20:59 2009

现在用 vim 的话,道理也一样。先设置快捷键:

imap <F2> <C-R>=strftime("%c")<CR>

然后按 F2 就可以了。以上代码来自 c9sslides

如果要调用外部命令,比如打印这样的时间格式:

2009-11-17 18:33:32

可以这样设置:

imap <F2> <C-R>=system('perl -MClass::Date -e "print Class::Date::now"')<CR>

貌似这是我第一次正儿八经用快捷键映射,落伍了。

pod2html: no title for

用 pod2html 转以前写的模块,发现有些报这种错误:

pod2html: no title for /path/to/module.pm

一时半会儿 google 不到,问人也没碰到过。一番折半查找后,发现

=head1 NAME
 
Module::Name

这样的写法不规范,需要补上 ‘ – what is this’ 这样的简述:

=head1 NAME
 
Module::Name - Yet another perl module

chunzi.planet

整理了下 planet.chunzi.me/perl 的配置,发到 github 上去 chunzi.planet。原来借用 bulknews 的 css 后来才发现被墙,改了下用本地的。另外用 feedburner 作了 feed 链接图标。原来 feed 的地址因为配置问题有误,感谢 Fayland 提醒~

既然有了关于 perl 的聚合,接下来还想搞下 git 和 vim 的。总之 planet.chunzi.me 站点就是 plagger 的集合。方便自己看,也方便别人看。说起来完全可以用 google reader 订阅这些地址,不过是这里的聚合作了简单过滤,仅仅是关心 perl 而不是人。就如同 Planet Perl Iron Man 所做的一样。

Planet PerlChina

突然心血来潮,看到 planet.perlchina.org 有些简陋,想自己动手。以前没用过 Plagger,快速上手熟悉了下。cpan 上的版本 0.7.17 还是 2006 年发布的,十分老旧,github 上 Plagger 项目倒还是在持续开发,下来 make test 许多通不过,只好用 “stable” 版,安装时需要手工下载安装老的 XML::Feed 模块。plagger 就是一个命令行工具,读取给定的配置文件,从网上抓 feeds 处理之后生成静态网页,保存到指定目录。

So, 我自己建了个 planet.chunzi.me,并找了一堆写 perl 文章的 blog,配好架起 planet.chunzi.me/perl。可以说是 planet.perlchina.org 的克隆吧。所采纳的 feed 一般限于 perl 标签的 feed。所以这个聚合仅仅关心 perl。如果你对作者感兴趣,请直接订阅 blog。当然,plagger 聚合出来的也是可以订阅的。plagger 号称是 feed 的 pipe,我很喜欢 pipe。

在最下方列出了订阅列表。如果有版权问题,或者想增加你的 blog 或者推荐 feed,都请给我邮件:chunzi@gmail.com

目前手动生成页面,稍后改用 cronjob,再把相关代码配置放到 github 上去。

《Perl 语言入门(第五版)》现已发售

终于,eventually,finally,《Perl 语言入门(第五版)》出版开卖了,至少在 china-pub 上。去年 11 月底就交的稿,等了一年,花开花落,瓜熟蒂落。虽然是老书再版,却也增加了许多新的内容,比如 Perl 5.10 许多有意思的特性。初学者快速上手的最佳选择。看完这本书,就该动手实践了,或者应该说,边看就该马上实践。

Web::Scraper

若是要提取 html 文件中的某些内容,该怎么做?直接用正则表达式。或者用解析 HTML 的模块 HTML::TokeParser::Simple 或者 HTML::Parser。嫌麻烦?可以试试看 Web::Scraper。比如:

my $res = scraper { process "div.message", message => 'TEXT' }->scrape($content);

文档中展示的用法,非常简练,和 jquery 一样符合直觉的操作方式:

  use URI;
  use Web::Scraper;
 
  my $tweets = scraper {
      process "li.status", "tweets[]" => scraper {
          process ".entry-content", body => 'TEXT';
          process ".entry-date", when => 'TEXT';
          process 'a[rel="bookmark"]', link => '@href';
      };
  };
 
  my $res = $tweets->scrape( URI->new("http://twitter.com/miyagawa") );
 
  for my $tweet (@{$res->{tweets}}) {
      print "$tweet->{body} $tweet->{when} (link: $tweet->{link})\n";
  }