list Perl core modules with Module::CoreList

Core Modules就是安装Perl时缺省安装的那些。既然下定决心每个月至少读2个Module的源代码,那总要先知道都有那些Core Modules吧。

最简单的办法就是打开文件夹看看,可惜这个方法对我无效,因为我装Perl的机器上肯定早就密密麻麻布满了很多我会用到的Module。幸好,还有Module::CoreList。

更让人省事的是该Module里还带有一个写好的脚本——corelist。使用-v选项,该程序会打印出它支持的Perl版本,然后使用-v选项加上特定的版本号就可以显示那个版本有哪些Core Modules了,比如想看5.009003版本:

$ corelist -v 5.009003

其实Module::CoreList以前也关注过,但是它的帮助写得不太明白,看完了还是不知道它能干什么,该怎么用。后来发现有这么个脚本,肯定要看看人家是怎么写的。除了Module::CoreList,它还用了Getopt::Long和Pod::Usage,Getopt::Long我用过好多次了,可人家那种用法没见过;Pod::Usage是在写基金计算器的时候第一次接触,遂爱不释手,Perl程序员果然是懒惰的天才,或者说天才般的懒惰,居然将文档、帮助和注释合三为一。

utf8 flag must be off when using XML::Atom

使用XML::Atom可以很方便地为Perl脚本增加生成Atom Feed的功能。例如生成一个entry的代码如下:

use XML::Atom::Entry;

$entry = XML::Atom::Entry;
$entry->title('我的标题');
$entry->updated('2007-01-16T08:00:00+08:00');
$entry->id('my unique id for this entry');
$entry->summary('oops');

$link = XML::Atom::Link->new;
$link->type('text/html');
$link->rel('alternate');
$link->href('http://example.com/entry.html');

$entry->add_link($link);

print $entry->as_xml_utf8;

到目前为止,一切都很好。

在实际的代码中,我们不可能把内容静态地写在代码里,而是从其它地方获得的,这时,就有可能发生编码问题。比如,标题是从某个网页上提取出来的:

use LWP::UserAgent;

$ua = LWP::UserAgent->new;
$response = $ua->get($url);
$content = $response->decoded_content;
($year, $month, $day) = extract_date_from_web_page($content);
$entry->title("$year年$month月$day日");

这时打印出来的标题是乱码。

原因是经过decode后,变量$year、$month和$day的utf8 flag被打开了,应先将其关掉:

use Encode;
Encode::_utf8_off($year);
Encode::_utf8_off($month);
Encode::_utf8_off($day);
$entry->title("$year年$month月$day日");

这样,编码就正确了。