我遇到了一个似乎是变量作用域问题,这是我以前没有遇到过的。我正在使用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 占位符变量的值似乎未初始化。其他两个占位符变量可用。
问题:为什么在do()语句中无法使用%in哈希,除非我将其用双引号括起来(#2占位符)或将其重新分配给新变量(#3占位符)?
我认为这与CGI模块的ReadParse()函数如何将作用域分配给%in哈希有关,但我不了解Perl作用域的情况,无法理解为什么%in可以从顶层访问,但无法从我的do()语句中访问。
如果有人了解作用域问题,是否有更好的处理方法?将所有%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的标准函数。我理解的方式是,除了满足strict之外,我不需要初始化%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文档的要求来做。