1

关于使用 Perl CGI 模块的问题:

假设我有一个名为 foo 的子程序,它接受两个定义如下的参数:

sub foo {
   local($a, $b) = @_;
   print "a= [$a]";
}

在我的主程序中,我采用一些表单参数并将它们传递给 foo ,如下所示:

use CGI;
$cgi = CGI->new;
foo($cgi->param('field1'), $cgi->param('field2'));

如果表单没有为 field1 传递值(在我的例子中,使用了一个名为 field1 的 SELECT 字段,没有可供选择的值),子 foo 将 $a 设置为在 $cgi->param 中传递的值('field2'),这是一个非空值。

谁能帮我理解为什么会发生这种情况以及为什么 $a 不仅仅是一个空白 ('') 值和 $b = 从 $cgi->param('field2') 发送的值?

我确信有一个合乎逻辑的原因,但我不是 Perl 专业人士,所以我确信这是我还没有学习或理解 Perl 的东西。

提前致谢!

4

1 回答 1

3

CGIparam()如果在列表或标量上下文中调用,的函数的行为会有所不同。在标量上下文中,返回第一个(也是唯一的)参数值。在列表上下文中,返回所有参数值(请记住,CGI 允许每个键有多个值)。

如果您像这样调用您的函数,则使用列表上下文。这意味着$cgi->param('field1')计算结果为空列表,并且在子例程$cgi->param('field2')中分配了的第一个值。$a为避免这种情况,您必须明确强制标量上下文。这可以通过使用来完成scalar

foo(scalar($cgi->param('field1')), scalar($cgi->param('field2')));

另一种可能性是使用中间变量:

my $field1 = $cgi->param('field1'); # scalar context here
my $field2 = $cgi->param('field2');
foo($field1, $field2);
于 2013-09-07T06:51:25.793 回答