繁体   English   中英

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

[英]Perl: CGI module - passing param() as parameters to subroutines

有关使用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的知识。

提前致谢!

如果在列表或标量上下文中调用, 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM