CN Perl Advent Calendar 2009-12-21

Template::Extract

by Fayland Lam

Template::Extract 由☻ 唐鳳 ☺ 所编写,可以使用 TT2 表达式从某个数据里提取东西,而无须使用正则表达式。

一般来说,得到一个 HTML 内容之后,可以使用正则,或者类如 HTML::TreeBuilder 之类的模块来提取数据。本文介绍的模块能同样使 job 完成,并且更加优雅。

以我们当前的 http://perlchina.org/advent/ 举例,得到所有的 link 和对应的编号。

   1 use strict;
   2 use warnings;
   3 use LWP::Simple 'get';
   4 use Template::Extract;
   5 use Data::Dumper::Perltidy; # or just Data::Dumper
   6 
   7 my $html = get('http://perlchina.org/advent/');
   8 my $rule = <<RULE;
   9 [% FOREACH link IN links %]
  10 <br><div class="[% ... %]"><a href="[% link.url %]" style="[% ... %]">[% link.num %]</a></div>
  11 [% END %]
  12 RULE
  13 
  14 my $extract = Template::Extract->new();
  15 my $data = $extract->extract($rule, $html);
  16 print Dumper(\$data);

运行一下:

$VAR1 = \{
    'links' => [
        {
            'link' => {
                'num' => '1',
                'url' => '2009/local_lib.html'
            }
        },
        {
            'link' => {
                'num' => '2',
                'url' => '2009/PerlDevENV.html'
            }
        },
        {
            'link' => {
                'num' => '3',
                'url' => '2009/EndScope.html'
            }
        },
        {
            'link' => {
                'num' => '4',
                'url' => '2009/autodie.html'
            }
        },
        {
            'link' => {
                'num' => '5',
                'url' => '2009/SSHBatch.html'
            }
        },
...

代码简单可靠。:) Enjoy

谢谢。

View Source (POD)