我遇到了以前从未遇到过的变量范围问题。我正在使用 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 占位符变量评估为好像它未初始化。其他两个占位符变量有效。
问题:为什么 %in 散列在 do() 的上下文中不可用,除非我将它用双引号(#2 占位符)括起来或将值重新分配给新变量(#3 占位符)?
我认为这与 CGI 模块的 ReadParse() 函数如何将范围分配给 %in 散列有关,但我不太了解 Perl 范围,无法理解为什么 %in 在顶层可用,但不能在我的内部使用() 陈述。
如果有人确实了解范围界定问题,是否有更好的方法来处理它?将所有 %in 引用用双引号括起来似乎有点混乱。为每个查询参数创建新变量是不现实的。
为了清楚起见,我的问题是关于变量范围的问题。我意识到 ReadParse() 不是使用 CGI 获取查询参数的推荐方法。
我正在使用 Perl 5.8.8、CGI 3.20 和 DBI 1.52。提前感谢任何阅读本文的人。
@Pi 和 @Bob,感谢您的建议。预先声明 %in 的范围没有效果(我总是使用严格的)。结果与之前相同:在 db 中,col1 为空,而 cols 2 和 3 设置为预期值。
作为参考,这里是 ReadParse 函数(见下文)。它是 CGI.pm 的一部分的标准函数。根据我的理解,我并不是为了设置范围而初始化 %in 哈希(除了满足严格之外),因为在我看来该函数可以处理:
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 文档的确切方式。