マッチ変数の落とし穴

どの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 = $';


出力を眺めないと見つからないバグでした.
気をつけねば...