【发布时间】:2008-09-18 01:42:44
【问题描述】:
我遇到了一个似乎以前没有遇到过的变量范围问题。我正在使用 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 在顶层可用但不能从在我的 do() 语句中。
如果有人确实了解范围界定问题,是否有更好的方法来处理它?将所有 %in 引用用双引号括起来似乎有点混乱。为每个查询参数创建新变量是不现实的。
为了清楚起见,我的问题是关于变量范围的问题。我意识到 ReadParse() 不是使用 CGI 获取查询参数的推荐方法。
我正在使用 Perl 5.8.8、CGI 3.20 和 DBI 1.52。提前感谢任何阅读本文的人。
@Pi 和@Bob,感谢您的建议。预先声明 %in 的范围没有效果(我总是使用严格的)。结果和之前一样:在 db 中,col1 为 null,而 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() 但在这种情况下,我认为最好坚持使用 the CGI.pm documentation has it 的确切方式。
【问题讨论】:
-
在与您的呼叫相同的上下文中将其声明为我的。您也没有将其分配给任何东西。当您只需要哈希时,为什么要使用 *in?这是一个非常复杂的子程序。也许我可以与您一起清理或更好地了解您的需求。你能告诉我们你在哪里调用这个子吗?
标签: perl module variables scope cgi