THIS MODULE IS BETA. YOU SHOULD NOT USE
動機
ModPerl::Registryでは__DATA__
を読み込むことができないのは周知の事実かと思います.
なんかよくわかりませんが,twitterのtimelineで__DATA__
を読むことができないかと盛り上がってる感じがしたので,チャレンジしてみました.
HOW TO USE
Data::Section::Simpleと同じです
URL
p5-apache2-data-section-simple
動作環境
動作確認をしたのは以下の環境です
- FreeBSD 8.1-RELEASE
- Apache/2.2.17 (FreeBSD)
- mod_perl2.0.5
- perl v5.10.1
mod_perl1の場合は__END__と__DATA__の各トークンは、対象スクリプト中に存在すらしていてはいけません。アクセスされてApache::Registryのコンパイルが走った時点でエラーになります。理由は、virutalhostとuriから生成したパッケージ名を作って、そのスクリプトがそのパッケージの sub handler { ... } 内にあるかのようなコードを生成して文字列evalを行うからです。Apache::Registryのドキュメントには、スクリプトには__END__と__DATA__を含めてはいけない、と書かれています。Apache::PerlRunも同様です。
返信削除mod_perl2の場合も高速化の手法は同様ですが、mod_perl1のようにエラーになることを回避するために、__END__と__DATA__の各トークンは、対象スクリプトのコンパイル時に取り除かれるようになりました。Registryファミリーの親クラスであるModPerl::RegistryCookerのstrip_end_data_segmentメソッドがそれを行っています。なので、エラーにはなりませんが、コンパイルされたスクリプト内で普通にDATAファイルハンドルからデータを読み出そうとしても徒労に終わります。
mod_perl1だとそんな動作なんですね。2系しか使ったことがないので知りませんでした。後で対応しようと思ってましたが、それだと無理そうですね。
削除> 対象スクリプトのコンパイル時に取り除かれるようになりました
最初はなんとかDATA handlerから読もうとしましたが、Tetsujiさんも言っているように、この挙動があるので、結局自分自身をファイルとして開いて__DATA__以下を引っ張ってくるかたちで実装しました。