2009年02月16日 16:00 [Edit]

perl - Encode-2.31 Released, 2.30 zapped, regexp bug in 5.10.0

変更はそれほどありません。

$Revision: 2.31 $ $Date: 2009/02/16 06:18:09 $
! lib/Encode/MIME/Header.pm
  "Revert [29767] and [29771] since it breaks perl 5.8" by miyagawa
  http://coderepos.org/share/changeset/30111

2.30 2009/02/15 17:44:13
! encoding.pm
  fixed regexes, et cetera. by drry
  http://coderepos.org/share/changeset/29767
! lib/Encode/MIME/Header.pm
  Addressed: Encode::MIME::Header::decode should respect CHECK
  http://rt.cpan.org/Ticket/Display.html?id=43204
  http://coderepos.org/share/changeset/29767

drryさん、ありがとうございました。が、一つだけお願い。//は使わないで下さい。Perl 5.8ではサポートしていないので。||と置き換えました。この場合はそれでOKなので。

....ごめん。//の出所はこっちの方でした。

mergeするときにこんがらがっちゃいました。

Dan the Encode Maintainer

追記[同日16:00]:

MIYAGAWA reports
This change made Encode/MIME/Header.pm not compile on 5.8. Reverted.
http://coderepos.org/share/changeset/30111

Ship 2.31 with the trunk :(

ぎゃああ、なんてこったい。というわけで2.31をreleaseしたのですが、問題となったのはたった一つの+でした。

--- lib/Encode/MIME/Header.pm	2009/02/15 17:44:13	2.8
+++ lib/Encode/MIME/Header.pm	2009/02/16 06:18:13
@@ -100,7 +100,7 @@
 my $re_encoded_word = qr{
     =\?                # begin encoded word
     (?:[-0-9A-Za-z_]+) # charset (encoding)
-    (?:\*[A-Za-z]{1,8}+(?:-[A-Za-z]{1,8})*)? # language (RFC 2231)
+    (?:\*[A-Za-z]{1,8}(?:-[A-Za-z]{1,8})*)? # language (RFC 2231)
     \?(?:[QqBb])\?     # delimiter
     (?:.*?)            # Base64-encodede contents
     \?=                # end encoded word

ちょっと調べてみると....

% perl5.10.0  -le 'print "perl" =~ /^\w{1,8}+$/'
1
% perl5.8.8   -le 'print "perl" =~ /^\w{1,8}+$/'
Nested quantifiers in regex; marked by <-- HERE in m/^\w{1,8}+ <-- HERE $/ at -e line 1.

というわけで、Perl 5.10.0 の bug を偶然にも踏んでいたようです。bleedperlとmaintperlでもチェックしてみようとしたら、現在の revision がどっちもコンパイルしない....


この記事へのトラックバックURL

この記事へのトラックバック
Encode 2.32 を Release したのでお知らせします。 /lang/perl/Encode/trunk - CodeRepos::Share - Trac Dan Kogai / Encode - search.cpan.org http://www.dan.co.jp/~dankogai/cpan/Encode-2.32.tar.gz
perl - Encode-2.32 Released!【404 Blog Not Found】at 2009年03月07日 17:06
この記事へのコメント
自己TBされてなかったのでコメントしておきます。

regexp - possessive quantifier (独占的|絶対最大)量指定子とは何か?
http://blog.livedoor.jp/dankogai/archives/51178734.html
> ちがうよ!バグじゃないよ!


> - (?:\*[A-Za-z]{1,8}+(?:-[A-Za-z]{1,8})*)? # language (RFC 2231)
> + (?:\*[A-Za-z]{1,8}(?:-[A-Za-z]{1,8})*)? # language (RFC 2231)

これって、いつものノリで「一つ以上」という感覚で + 付けちゃた感じでしょうか。
RFC2231 → RFC1766 とか辿ったあたりで力尽きましたけど、{1,8}ぐらいの幅なら
絶対最大量指定子(possessive quantifier)を使う場面でもなさそう、と思いました。
Posted by edry(えどりぃ) at 2009年02月21日 09:54