mod_perlhandler
は、スクリプトの名前とパスに基づいて、パッケージ内で呼び出されるサブルーチンで各Perlスクリプトをラップすることによって機能します。各スクリプトを実行するための新しいプロセスを開始する代わりに、このhandler
サブルーチンは、多数の永続的なPerlシードの1つによって呼び出されます。
通常、この知識はmod_cgiからの環境の変化を理解するのに大いに役立ちますが、プログラムに追加use strict
したことがなく、宣言された変数の動作に慣れていないため、追いつくことがたくさんあります。
mod_perl環境は、明らかでないセキュリティ違反を引き起こす可能性があるため、ここからすべてのスクリプトを開始し、すべてuse strict
の変数を宣言する必要があります。エラーログを理解するのにも役立ちます。use Carp
で宣言された変数名はour
、同じ名前のパッケージ変数の字句スコープの同義語であり、パッケージ名を含めることで名前を完全に修飾せずに使用できます。たとえば、通常、で宣言された変数は、を指定せずにスカラーour $var
へのアクセスを提供します$main::var
(先行package
する宣言がない場合)main::
。ただし、mod_cgiの値で開始されたこのような変数はundef
、任意のmod_perlスレッドの前回の実行からの値を保持するようになり、一貫性を保つために、宣言の時点で常に初期化するのが最も安全です。また、 mod_perlmain
がラップされているため、デフォルトのパッケージ名は使用されなくなったことにも注意してください。そのため、プレフィックスを使用してパッケージ変数にアクセスできなくなります。パッケージmain::
の実際の名前を見つけて明示的に使用することは賢明ではありません。これは非常に長い名前であり、スクリプトを移動または名前変更すると変更されるためです。
変数は、パッケージシンボルテーブルとは独立して存在するmy
変数であり、通常、その存続期間は、囲んでいるファイル(ファイルスコープで宣言された変数の場合)またはサブルーチンの実行時間です。スクリプトのファイルスコープで宣言して使用する場合、または完全に1つのサブルーチン内で使用する場合は、 mod_perlで安全ですが、スコープを組み合わせmy $global
てファイルスコープで宣言してからサブルーチンで使用しようとすると、問題が発生する可能性があります。この理由は単純ではありませんが、mod_perlがスクリプトをhandler
サブルーチンでラップしているため、サブルーチン宣言がネストされていることが原因です。$global
内部サブルーチンは、の最初のインスタンス化のみを採用し、後の呼び出しによって作成された他のインスタンス化を無視する傾向があります。handler
。グローバル変数が必要な場合は、our
上記のように宣言し、その宣言で初期化する必要があります。
変数は、パッケージ変数の同義語を形成するという点で変数に非常local
に似ています。our
ただし、その変数の現在の値を一時的に保存し、ファイルまたはブロックスコープの最後まで使用するための新しいコピーを提供します。スコープ内での自動作成と削除により、特にクラスのインスタンスなどのデータ構造へのポインターを使用している場合は、mod_perlmy
スクリプトの変数の代わりに使用すると便利です。宣言するとオブジェクトは正しく作成されますが、mod_perlの永続性のため、スレッドの次の実行でオブジェクトが削除されて別のオブジェクト用のスペースが確保されるまで、オブジェクトはメモリに残ります。CGI
our $cgi = CGI->new
あなたの質問に関して:
変数を宣言せずに使用すると、use strict
適切な場所にある場合はコンパイル時エラーが発生します。それ以外の場合は、現在のパッケージ名前空間内のその変数の同義語です。
変数は、パッケージ変数または字句変数のいずれかです。変数をそのようにプライベートとして宣言する方法はありません。字句変数(で宣言my
)は、スクリプトを実行するたびに作成および破棄されます。ただし、上記のように、より広いスコープで宣言された変数を使用するサブルーチンを記述して無効なクロージャを作成した場合を除きます。やりたいことをやらないでください。で宣言された変数はour
、スクリプトの呼び出し全体でその値を保持しますが、で宣言された変数はlocal
、スクリプトが終了すると破棄されます。our
および変数は両方ともlocal
パッケージ変数であり、同じ変数名へのすべての参照は同じ変数を参照します。
スクリプトの1回の呼び出し内のどこからでも一貫してアクセスできる変数を宣言するには、local
変数または初期化された変数のいずれかを使用できour
ます。atファイルスコープは、mod_perlスクリプトの場合local $global
とほぼ同じです。変数を使用してデータ構造を指す場合は、スクリプトの最後で。を使用して変数を破棄することを忘れないでください。our $global = undef
our
undef $global
my
if
変数は、それが、、、、while
またはfor
単なる{ ... }
ブロックスコープ内のブロックであるかどうかに関係なく、変数が宣言されているブロックに固有であり、その中で表示されます。my
ブロック内でのみ使用され、他の場所からアクセスされない一時作業変数には、常に変数を使用してください。
これがお役に立てば幸いです