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

标签 perl module variables scope cgi

我遇到了以前从未遇到过的变量范围问题。我正在使用 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/

相关文章:

xml - Perl XML::LibXML 文本内容

java - 动态加载的 spring 上下文

ruby - 仅扩展一个 block 调用

ruby - 如何访问 IRB 所需的 Ruby 文件中定义的变量?

arrays - Perl 简单的 FIFO 计算

regex - 如何在 Perl 中用不同的随机值多次替换同一个字符串?

python - 在 OR 工具 pywrapcp 中遇到 DLL 错误

javascript - 即使在函数中更新后,全局对象仍未定义

javascript - 如何将 CSS 样式添加到 javascript

perl - 如何使用 perlbrew 管理针对 Web 应用程序的 perl 安装?