マッチ変数の落とし穴
どのPerl本でも注意されていることに見事にハマった
while($html =~ m|<li class="post" key="(.+?)\.\.\.\s.+?</span>\s*?</div>\s*?</li>|gs){ $tmp_html =~ m|<h4 class="desc"><a href="(\S+?)" rel=|s; # (1) ここが問題 my $tmp_url = $1; $tmp_html = $'; $tmp_html =~ m|">(.+?)</a>|s; # (2) ここも問題 my $tmp_title = $1; $tmp_html = $'; ... }
whileの条件部分がtrueになれば(1)と(2)の表現にマッチしなくても,$1は保持されたままなので
意図せず代入されてしまう.
いろんな改善方法があるけれど,Perlらしく解決
next unless ($tmp_html =~ m|<h4 class="desc"><a href="(\S+?)" rel=|s); # (1) my $tmp_url = $1; $tmp_html = $'; next unless ($tmp_html =~ m|">(.+?)</a>|s); # (2) my $tmp_title = $1; $tmp_html = $';
出力を眺めないと見つからないバグでした.
気をつけねば...