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とかが有名なのかな?