我将一些参数传递给一个函数,其中一个可能是未定义的。
$a = ($config->function(param('a'),'int'));
我的模块包含一个如下所示的函数:
sub function{
my $self = $_[0];
my $t = $_[1];
my $type = $_[2];
print "$self,$t,$type<br/>";
}
我尝试使用shift
代替@_
语法,但没有任何变化。
问题是,如果使用未定义的$config->function
调用param('a')
,则打印方式如下:
MY_FUNC=HASH(0x206e9e0),name,
似乎$t
被设置为$type
应该是的值,并且undef
被完全忽略。
答案 0 :(得分:3)
undef
在参数列表中完全有效。我怀疑这里的问题是param
函数返回一个空列表,而不是undef
。
sub function {
no warnings 'uninitialized';
print join "/", @_;
}
function(undef,"foo"); # outputs "/foo"
function((), "foo"); # outputs "foo"
在function
的参数列表中,param
函数在列表上下文中进行评估。
sub param1 {
return; # undef in scalar context, but empty list in list context
}
sub param2 {
return undef; # scalar ctx: undef, list ctx: list with one undef elem
}
function(param1(), "foo"); # param1() -> () ... outputs "foo"
function(param2(), "foo"); # param2() -> (undef) ... outputs "/foo"
解决方法是确保在标量上下文中评估您的param
函数。
function(scalar param1(), "foo"); # now outputs "/foo"
请注意,实际上Perl子例程中的return undef
是considered by some to be a code smell。
答案 1 :(得分:3)
如果出现错误,CGI param
方法正确返回空列表。这是Perl子例程和方法的标准行为,在erorr的情况下返回 false 值。
正如@mob所说,显式return undef
错误正是因为它在列表上下文中返回一个元素列表。这是 true 值并且意味着成功,如果更改了代码会破坏很多代码
您需要做的就是更改代码以单独提取参数
my $param = param('a');
$config->function($param, 'int'));
或者如果您真的热衷于将调用放入参数列表中,那么您可以编写
$config->function(scalar param('a'), 'int'));
或
$config->function(param('a') // undef, 'int'));
答案 2 :(得分:1)
[我这是作为评论开始的,但它太长了]。
在参数列表中,参数在列表上下文中计算。两个答案已经注意到了,但我认为你错过了它所讨论的所有其他事情。
除此之外,param
必须处理至少三个案例,林肯选择的界面虽然有时令人讨厌,但却是处理它们的好方法。
查询参数a
根本不显示:
b=1
出现查询参数a
,但没有值:
a=&b=1
查询参数a
会显示一个值:
a=1&b=1