gpt4 book ai didi

Perl:CGI 和 DBI 模块的变量范围问题

转载 作者:行者123 更新时间:2023-12-01 07:06:17 25 4
gpt4 key购买 nike

我遇到了以前从未遇到过的变量范围问题。我正在使用 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() 但在这种情况下,我认为最好坚持使用 the CGI.pm documentation has it确切地。

最佳答案

它实际上看起来不像文档中描述的那样使用它:
https://metacpan.org/pod/CGI#COMPATIBILITY-WITH-CGI-LIB.PL

如果你必须使用它,那么 CGI::ReadParse();似乎更明智且不那么粗暴的语法。虽然我看不出它在这种情况下有什么不同,但它是一个绑定(bind)变量,所以谁知道它在做什么;)

您不能使用更常见的 $cgi->param('foo') 语法是否有特殊原因?它更干净一点,并且以一种更可预测的方式弄脏了你的命名空间。

关于Perl:CGI 和 DBI 模块的变量范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/89257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com