読者です 読者をやめる 読者になる 読者になる

はちゅにっき

こっちのブログはまったり更新

Template::Extract を使ってみよぅ

CGI、Socket、CUIのそれぞれで FEATHER の録画予約をする
とゆープログラムを作っているのですが
今回は iEPG からの予約を可能とするため
iEPG の解析(ってゆーのはウソ)のために
Template::Extract を使ってみました。

Template::Extract についてですが、名前から察するように
Template-Toolkit のサブクラスモジュールだそうです。
やってることは簡単、Template-Toolkit が テンプレートを基に
文書を吐き出すように、Template::Extract ではテンプレートから
データを読み出してくれるモジュールのようです。
そんなワケで、Template-Toolkit を使う感覚で
テンプレートの作成を行い、データ構造の解析ができてしまうのデス。
Spidering hacks―ウェブ情報ラクラク取得テクニック101選
で紹介されていて、イロイロなwebサイト*1にも乗っていたので
ちょっと面白そうだなー、と思い今回使ってみるコトに。

さてさて、それでは早速。
まず、解析するためのテンプレート。

[% ... %]
station: [% station %]
year: [% year %]
month: [% month %]
date: [% date %]
start: [% start %]
end: [% end %]
program-title: [% title %]
[% ... %]

明らかに単純な構造ですし、ふつーに正規表現使ってもよさそうですネ。
ま、でもこんな感じで使えるとゆーことで。
繰り返し処理が必要な場合は、Template-Toolkit 同様に

[% FOREACH %]
...
[% END %]

が使えるようです。
で、Perlの方はこんな感じ。

sub _ResvFile
{
    my $iEPG  = shift;
    my $t_ext = Template::Extract->new( );
    my $template = 'tvpi.tt';

    croak("えらー:$!") unless sysopen(EPG, $iEPG,     O_RDONLY);
    croak("えらー:$!") unless sysopen(TMP, $template, O_RDONLY);

    # Extract する
    my $ext;
    {
        $/ = undef;
        $ext = $t_ext->extract(<TMP>, <EPG>);
    }

    close(TMP), close(EPG);

    print $ext->{station}, "\n";
    print $ext->{year}, "\n";
}

つまり $ext->{hoge} と記述するだけで
テンプレートの [% hoge %] の部分を読み取ってくれます。
うん、便利。
[% FOREACH %] でまわしている場合は、 $ext->{hoge} が
配列へのリファレンスで返ってくるので

foreach my $line (@{$ext->{hoge}}){
    ごにょごにょ
}

としてあげればいいみたいです。
便利だー。

*1:http://naoya.dyndns.org/~naoya/mt/archives/000833.htmlとかが有名なのかな?