12

我打算将两个变量传递给一个 perl 函数,其中一个可能是可选的。我正在尝试检查第二个是否已定义,但它无法正常工作。当我将该函数称为 myFunction(18) 时,它假定变量 $optional 已定义并转到 else 语句。但是在 else 语句中,当访问 $optional 变量时,它会引发“未初始化”错误。这与我的预期完全相反。任何帮助是极大的赞赏。

sub myFunction {
    my ($length, $optional) = (@_);

    if (undef($optional) {
        more code..
    }
    else {
        more code...
    }
}

myFunction(18);
4

2 回答 2

23

正确的函数是definedundef取消定义$optional。你想要做的是这样的:

sub myFunction {
    my($length, $optional) = @_;

    if (!defined $optional) {
        # Do whatever needs to be done if $optional isn't defined.
    }
    else {
        # Do whatever can be done if $optional *is* defined.
    }
}

处理它的另一种方法(尤其是 Perl 5.10+)是使用“定义或”运算符 , //,如下所示:

sub MyFunc {
    my $length = shift;
    my $optional = shift // 'Default Value';
    # Do your stuff here.
}

这样做是检测是否shift @_定义了返回值。由于您已经调用了一次 shift,我们现在正在测试第二个参数。如果已定义,请将值分配给$optional. 如果未定义,则分配'Default Value'$optional. 当然,您必须提出自己的理智默认值。

如果您陷入 Perl 5.10 之前的黑暗时代,您可以通过以下方式完成相同的操作:

my $optional = shift;
$optional = defined $optional ? $optional : 'Default value';

...或者...

my $length = shift;
my $optional = defined( $_[0] ) ? shift : 'Default value';

无论哪种方式,我通常更喜欢有一个健全的默认值,而不是一个完全独立的控制流路径。这通常是简化代码的好方法。

于 2013-02-09T21:47:29.277 回答
0
my $optional = defined( $_[0] ) ? shift : 'Default value';

这是危险的代码,因为它只会在定义时关闭参数,如果你有第三个参数,当你调用时会变得混乱

MyFunc( 10, undef, 20 )
于 2016-11-16T15:58:20.173 回答