XML::FeedPP で複数のカテゴリがあるときはネスト対応する
なんか、また技術的メモ。
JapanLocal.info のトップページ右側に、このエントリが表示されるようにしているんだけど、これは tafworks.com (実はココログ) にポストしたエントリが自動表示されるようにしているだけ。エントリに「JapanLocal」というカテゴリがセットしてあったら、エントリデータを取得して JapanLocal.info の中に組み込む、という具合にしてある。
これまではカテゴリが単独の「JapanLocal」だったら取得できたが、別のカテゴリが同時にセットしてあると取ってこなかった( ていうより、そこまで頭が回らなかった )。が、複数カテゴリでも対応できるようにしてやろうということで、プログラムを少々改良した。
@niftyのココログにポストしたエントリのフィードを、さくらインターネットで perl使って取得している。ポイントは次のとおり( 必要なところだけ )。
my $feed = XML::FeedPP->new( $source ) or die;
foreach my $item ( $feed->get_item() ) {
my @i_category = $item->category();
my $chk_categ;
if(@{$i_category[0]} == 0){
$chk_categ = @i_category[0];
}else{
$chk_categ = join("\t",@{$i_category[0]});
}
if(index($chk_categ, '何かキーワード')>-1){
# 何か処理
}
}
( JapanLocal.info で読んでいる人は上記コードが読みにくいと思います。ごめんなさい。リンクをたどってオリジナルのエントリをご覧ください )
カテゴリが一つのときは @i_category[0] のように配列先頭をスカラで取ればいいんだけど、カテゴリが複数になるとここが多次元配列になる――と、書いてみるとあまりにも当然すぎるんだけど。
ただし、ここで単純に @i_category[0] を join しようとしても ARRAY(0x…) のようにリファレンスが戻ってきてしまうので、 @{……} のようにして要素を呼び出してやる必要があるらしい。面倒だな~。
これで複数カテゴリをセットしても、目的とするカテゴリがセットしてあれば識別できるようになった。
【参考】 リファレンスについては次のページなんかが役に立った
・Perlのリファレンスの話 - ケーズメモ
http://d.hatena.ne.jp/ksmemo/20071214/p1
・リファレンス | Perl講座 [Smart]
http://rfs.jp/sb/perl/02/10.html