2

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

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

4

3 回答 3

4

undef在参数列表中完全有效。我怀疑这里的问题是该param函数返回一个空列表,而不是undef.

sub function {
    no warnings 'uninitialized';
    print join "/", @_;
}

function(undef,"foo");      #   outputs "/foo"
function((), "foo");        #   outputs "foo"

在 to 的参数列表中functionparam函数在列表上下文中进行评估。

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"

请注意,实际上return undef在您的 Perl 子例程中说的内容被某些人认为是代码异味

于 2012-08-23T16:03:16.057 回答
3

在发生错误的情况下, CGIparam方法正确地返回一个空列表。这是 Perl 子例程和方法的标准行为,它们在发生错误时返回错误值。

正如@mob 所说,显式return undef是错误的,因为它在列表上下文中返回一个单元素列表。这是一个真正的价值,意味着成功,如果改变它会破坏很多代码

您需要做的就是更改代码以单独提取参数

my $param = param('a');
$config->function($param, 'int'));

或者如果你真的很想把调用放在参数列表中,那么你可以写

$config->function(scalar param('a'), 'int'));

或者

$config->function(param('a') // undef, 'int'));
于 2012-08-23T16:55:57.423 回答
1

[我开始这是作为评论,但它太长了]。

在参数列表中,参数在列表上下文中进行评估。两个答案已经注意到了这一点,但我认为你错过了他们谈论的所有其他事情。

除此之外,param必须处理至少三种情况,林肯选择的界面虽然有时很烦人,但足以处理它们。

查询参数a根本没有出现:

b=1

查询参数a出现,但没有值:

a=&b=1

查询参数a出现一个值:

a=1&b=1
于 2012-08-24T08:36:06.290 回答