perl函数忽略undef参数

时间:2012-08-23 15:54:25

标签: perl

我将一些参数传递给一个函数,其中一个可能是未定义的。

$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被完全忽略。

3 个答案:

答案 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 undefconsidered 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