以前に遭遇したことのない可変スコープの問題と思われるものに遭遇しました。Perl の CGI モジュールと DBI の do() メソッドの呼び出しを使用しています。コード構造を少し簡略化したものを次に示します。
use DBI;
use CGI qw(:cgi-lib);
&ReadParse;
my $dbh = DBI->connect(...............);
my $test = $in{test};
$dbh->do(qq{INSERT INTO events VALUES (?,?,?)},undef,$in{test},"$in{test}",$test);
#1 プレースホルダー変数は、初期化されていないかのように評価されます。他の 2 つのプレースホルダー変数は機能します。
質問: do() のコンテキスト内で %in ハッシュを使用できないのはなぜですか?二重引用符で囲む (#2 プレースホルダー) か、値を新しい変数に再割り当てする (#3 プレースホルダー) 場合を除きます。
CGI モジュールの ReadParse() 関数がスコープを %in ハッシュに割り当てる方法と関係があると思いますが、なぜ %in がトップレベルで利用可能であるのに私の do 内からは利用できないのかを理解するのに十分なほど Perl のスコーピングを知りません。 () 声明。
誰かがスコーピングの問題を理解している場合、それを処理するより良い方法はありますか? すべての %in 参照を二重引用符で囲むのは少し面倒です。クエリ パラメータごとに新しい変数を作成するのは現実的ではありません。
明確にするために、私の質問は変数のスコープの問題に関するものです。ReadParse() は、CGI でクエリ パラメータを取得するための推奨される方法ではないことに気付きました。
Perl 5.8.8、CGI 3.20、および DBI 1.52 を使用しています。これを読んでいる人に事前に感謝します。
@Pi & @Bob、提案をありがとう。%in のスコープを事前に宣言しても効果はありません (私は常に strict を使用しています)。結果は前と同じです。データベースでは、col1 は null ですが、cols 2 と 3 は期待値に設定されています。
参考までに、ReadParse 関数を次に示します (以下を参照)。CGI.pmの標準機能です。私が理解しているように、関数はそれを処理するように見えるので、スコープを設定する目的で %in ハッシュを初期化するつもりはありません (strict を満たす以外)。
sub ReadParse {
local(*in);
if (@_) {
*in = $_[0];
} else {
my $pkg = caller();
*in=*{"${pkg}::in"};
}
tie(%in,CGI);
return scalar(keys %in);
}
私の質問は、do() のコンテキスト内で %in ハッシュを取得する最良の方法は何だと思いますか? 再度、感謝します!これが、元の質問に追加情報を提供する正しい方法であることを願っています。
@Dan: &ReadParse 構文について聞いたことがあります。通常は CGI::ReadParse() を使用しますが、この場合は、CGI.pm ドキュメントに正確に記載されている方法に固執するのが最善であると考えました。