PersistentPerlでCGI.pmが誤動作

PersistentPerlを使うと、2回目以降のリクエストでCGI.pmが-no_xhtmlを忘れてしまう。

  • PersistentPerl 2.22
  • CGI.pm 3.15

ぎりぎりまで切り分けた再現ケース。

#!/usr/bin/perperl -w
print "##### $ARGV[0]\n";
use CGI qw(-no_xhtml);
my $cgi = CGI->new();
print $cgi->start_html();

実行結果。

$ touch test.pl; ./test.pl 1; ./test.pl 2
##### 1
<!DOCTYPE html
        PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
         "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en-US"><head><title>Untitled Document</title>
</head>
<body>
##### 2
<!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>

と、このように1回目と2回目以降のリクエストでヘッダが変わってしまう。
CGI.pmを眺めているところだけど、全体的にパッケージ変数をゴリゴリ書き換えながら動いているので、たぶん他にも問題あるなあ。
mod_perlについては専用にいくつも処理が分岐しているところがあるので、PersistentPerlも同じようにケアしてあげないとダメと思われる。ちなみにmod_perlフラグを立てるとApache2.pmに依存してしまうので残念ながら動かない。一方FastCGI用にはCGI::Fastがあるので、比べてしまうとPersistentPerlはちょっとかわいそうな子。
うーん仕事じゃなくてよかった…