tag:blogger.com,1999:blog-8653813949780496014.post6668566103781731121..comments2024-03-29T16:19:05.780+09:00Comments on あろえの備忘録: Apache2::Data::Section::Simple - Data::Section::Simple for ModPerl::Registryaloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.comBlogger2125tag:blogger.com,1999:blog-8653813949780496014.post-83645832908859778072012-10-04T20:49:30.695+09:002012-10-04T20:49:30.695+09:00mod_perl1だとそんな動作なんですね。2系しか使ったことがないので知りませんでした。後で対応し...mod_perl1だとそんな動作なんですね。2系しか使ったことがないので知りませんでした。後で対応しようと思ってましたが、それだと無理そうですね。<br /><br />> 対象スクリプトのコンパイル時に取り除かれるようになりました<br />最初はなんとかDATA handlerから読もうとしましたが、Tetsujiさんも言っているように、この挙動があるので、結局自分自身をファイルとして開いて__DATA__以下を引っ張ってくるかたちで実装しました。aloelighthttps://www.blogger.com/profile/18113542990700990508noreply@blogger.comtag:blogger.com,1999:blog-8653813949780496014.post-3704615147006509112012-10-04T20:27:38.308+09:002012-10-04T20:27:38.308+09:00mod_perl1の場合は__END__と__DATA__の各トークンは、対象スクリプト中に存在すら...mod_perl1の場合は__END__と__DATA__の各トークンは、対象スクリプト中に存在すらしていてはいけません。アクセスされてApache::Registryのコンパイルが走った時点でエラーになります。理由は、virutalhostとuriから生成したパッケージ名を作って、そのスクリプトがそのパッケージの sub handler { ... } 内にあるかのようなコードを生成して文字列evalを行うからです。Apache::Registryのドキュメントには、スクリプトには__END__と__DATA__を含めてはいけない、と書かれています。Apache::PerlRunも同様です。<br /><br />mod_perl2の場合も高速化の手法は同様ですが、mod_perl1のようにエラーになることを回避するために、__END__と__DATA__の各トークンは、対象スクリプトのコンパイル時に取り除かれるようになりました。Registryファミリーの親クラスであるModPerl::RegistryCookerのstrip_end_data_segmentメソッドがそれを行っています。なので、エラーにはなりませんが、コンパイルされたスクリプト内で普通にDATAファイルハンドルからデータを読み出そうとしても徒労に終わります。xtetsujihttps://www.blogger.com/profile/12379812287294089559noreply@blogger.com