![](/img/trans.png)
[英]Perl - passing user inputted cgi form data to perl program to be then put into mysql database
[英]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的知识。
提前致谢!
如果在列表或标量上下文中调用, CGI
的param()
函数的行为将有所不同。 在标量上下文中,将返回第一个(也是唯一的)参数值。 在列表上下文中,将返回所有参数值(请记住,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.