HTML::Parserに入力するテキスト、最後に改行付けないと最終行処理されないよ

RSS 1.0のdescription要素とcontent:encoded要素の使い分けがずいぶん前にさんざん言われたときがあったんですけれども、とにかく、description要素はプレーンテキストが望ましいと言うことで、それを利用して、僕が作るシステムではRSSをメッセージングとして利用しているんだけれども、状況に応じて、description要素とcontent:encoded要素のどちらを拾うか選択しています。

そんで、RSS 1.0のdescription要素に仕込む、HTMLタグ取っ払ったテキスト作ろうとして、

Filename: reject_html.pl

#!/usr/bin/perl
use strict;
use warnings;
use HTML::Parser;

my $html_text = "やったー携帯小説できたよー(^o^)ノ<br>
<br>
 ───アタシの名前はアイ。心に傷を負った女子高生。モテカワスリムで恋愛体質の愛されガール♪<br>
アタシがつるんでる友達は援助交際をやってるミキ、学校にナイショで<br>
キャバクラで働いてるユウカ。訳あって不良グループの一員になってるアキナ。<br>
 友達がいてもやっぱり学校はタイクツ。今日もミキとちょっとしたことで口喧嘩になった。<br>
女のコ同士だとこんなこともあるからストレスが溜まるよね☆そんな時アタシは一人で繁華街を歩くことにしている。<br>
がんばった自分へのご褒美ってやつ?自分らしさの演出とも言うかな!<br>
 「あームカツク」・・。そんなことをつぶやきながらしつこいキャッチを軽くあしらう。<br>
「カノジョー、ちょっと話聞いてくれない?」どいつもこいつも同じようなセリフしか言わない。<br>
キャッチの男はカッコイイけどなんか薄っぺらくてキライだ。もっと等身大のアタシを見て欲しい。<br>
 「すいません・・。」・・・またか、とセレブなアタシは思った。シカトするつもりだったけど、<br>
チラっとキャッチの男の顔を見た。<br>
「・・!!」<br>
 ・・・チガウ・・・今までの男とはなにかが決定的に違う。スピリチュアルな感覚がアタシのカラダを<br>
駆け巡った・・。「・・(カッコイイ・・!!・・これって運命・・?)」<br>
男はホストだった。連れていかれてレイプされた。「キャーやめて!」ドラッグをきめた。<br>
「ガッシ!ボカッ!」アタシは死んだ。
スイーツ(笑)";
 print _reject_tags( $html_text );
# RSS用HTMLタグ除去
# HTMLタグを除去する
sub _reject_tags {
  my $html = shift;
  my $text = q();
  my $parser = HTML::Parser->new(
    api_version => 3,
    text_h      => [ sub { $text .= shift; }, "dtext" ]
  );
  $parser->parse( $html );
  return $text;
}

実行例:

$ perl reject_html.pl 
やったー携帯小説できたよー(^o^)ノ

 ───アタシの名前はアイ。心に傷を負った女子高生。モテカワスリムで恋愛体質の愛されガール♪
アタシがつるんでる友達は援助交際をやってるミキ、学校にナイショで
キャバクラで働いてるユウカ。訳あって不良グループの一員になってるアキナ。
 友達がいてもやっぱり学校はタイクツ。今日もミキとちょっとしたことで口喧嘩になった。
女のコ同士だとこんなこともあるからストレスが溜まるよね☆そんな時アタシは一人で繁華街を歩くことにしている。
がんばった自分へのご褒美ってやつ?自分らしさの演出とも言うかな!
 「あームカツク」・・。そんなことをつぶやきながらしつこいキャッチを軽くあしらう。
「カノジョー、ちょっと話聞いてくれない?」どいつもこいつも同じようなセリフしか言わない。
キャッチの男はカッコイイけどなんか薄っぺらくてキライだ。もっと等身大のアタシを見て欲しい。
 「すいません・・。」・・・またか、とセレブなアタシは思った。シカトするつもりだったけど、
チラっとキャッチの男の顔を見た。
「・・!!」
 ・・・チガウ・・・今までの男とはなにかが決定的に違う。スピリチュアルな感覚がアタシのカラダを
駆け巡った・・。「・・(カッコイイ・・!!・・これって運命・・?)」
男はホストだった。連れていかれてレイプされた。「キャーやめて!」ドラッグをきめた。
「ガッシ!ボカッ!」アタシは死んだ。$ 

オチで落ちません。
最後の行が処理されない。どうやら、最後に改行が必要みたいだね。

つうわけで、わかりやすく対処。入力に"\n"付けよう。出力はchompせずともいいみたい。

# RSS用HTMLタグ除去
# HTMLタグを除去する
sub _reject_tags {
  my $html = shift . "\n"; # HTML::Paserに最終行処理させるため改行付ける
  my $text = q();
  my $parser = HTML::Parser->new(
    api_version => 3,
    text_h      => [ sub { $text .= shift; }, "dtext" ]
  );
  $parser->parse( $html );
  return $text;
}

当たり障りがないタグ(とか)でくくるのもありかもね。