ふそうごむ。by扶桑ゴム産業

扶桑ゴム産業の最新情報とうぇぶますたあ「TKYK」の個人的日記。

CGIとmod_perlの動作の違いに関して

CGImod_perlの動作の違いに関して。 CGIプログラミング CGIプログラミング p458~460による言葉を引用すれば、
コードは一度にコンパイルされキャッシュされます。そのため、スクリプトのボディにあるレキシカル変数がサブルーチンの中でアクセスされるとクロージャが作成されます。一般的なCGIスクリプトでは次のようなことができます。  my $q = new CGI;  check_input( );  .  .  sub check_input {   unless ( $q->param( "email" ) ) {    error( $q, "電子メールアドレスが入力されていません" );   }   .   . このスクリプトでは、check_inputにはCGIオブジェクトを渡していません。それなのに、変数はサブルーチンからは見えています。...CGIでは問題なく機能しますが、mod_perlでは非常に難解で厄介なエラーが発生してしまいます。 -問題は、最初にApacheの子プロセスでスクリプトが実行される際に、CGIオブジェクトの値がキャッシュされたcheck_inputのコピーにトラップされることです。次回以降の同じApacheの子プロセスへの呼び出しはすべて、check_input内の以前のCGIオブジェクトの値が再利用されます。 -この問題は、$qをパラメタとしてcheck_inputに渡すか、または$qをレキシカル変数からグローバルなlocal変数に変更することで解決できます。
テストもしてみたが、サブルーチン内の$qは最初以外は2回目以降も同じ値(つまりキャッシュされている)で、サブルーチンの外(スクリプトのボディ)だと、毎回値が変わっているので、このあたりを頭に入れないといけないということ。簡単な方法は、myをourにすればいい。 でも今悩んでいるのは、mod_perlではうまく動くのに、普通のCGI動作だと変な動作をする件。あれこれ悩んで、上の記事も見て、実験したり試行錯誤やってもどうも変。電子の大きさになって調べたい気分。 本件と全く関係ないがさっき思いついたイメージを言葉で表わすと:焼肉換算。 お、あと、パチっとくる、だった(意味不明だ)