在Perl中使用defined/undef

use*_*663 12 perl

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

sub myFunction {
  my ($length, $optional) = (@_);
  if(undef($optional)
  {
    more code..
  }
  else
  {
    more code...
  }
}

myFunction(18)
Run Code Online (Sandbox Code Playgroud)

Dav*_*idO 22

正确的功能是defined. undef未定义$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.
    }
}
Run Code Online (Sandbox Code Playgroud)

处理它的另一种方法(特别是Perl 5.10+)是使用"defined或"运算符//,如下所示:

sub MyFunc {
    my $length = shift;
    my $optional = shift // 'Default Value';
    # Do your stuff here.
}
Run Code Online (Sandbox Code Playgroud)

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

如果你陷入了Perl 5.10之前的黑暗时代,你可以用以下方法完成同样的事情:

my $optional = shift;
$optional = defined $optional ? $optional : 'Default value';
Run Code Online (Sandbox Code Playgroud)

...要么...

my $length = shift;
my $optional = defined( $_[0] ) ? shift : 'Default value';
Run Code Online (Sandbox Code Playgroud)

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

  • `$SCALAR = undef;` 只是取消定义。`undef(VAR)` 可以做更多的事情,即使对于标量也是如此。(它释放各种内存位。) (2认同)