Perl:CGI模块 - 将param()作为参数传递给子例程

时间:2013-09-07 02:06:55

标签: forms perl cgi param

关于使用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。

提前致谢!

1 个答案:

答案 0 :(得分:3)

如果在列表或标量上下文中调用,

CGI的{​​{1}}函数的行为会有所不同。在标量上下文中,返回第一个(也是唯一的)参数值。在列表上下文中,返回所有参数值(请记住,CGI允许每个键具有多个值)。

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

来完成
scalar

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

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