如何检查Perl标量变量是否已初始化?

kal*_*kal 33 perl

以下是检查标量变量是否在Perl中初始化的最佳方法,使用defined

my $var;

if (cond) {
    $var = "string1";
}

# Is this the correct way?
if (defined $var) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

raf*_*afl 34

Perl没有提供检查变量是否已初始化的方法.

但是,未使用某些值显式初始化的标量变量undef默认情况下具有值.你是正确defined的方法来检查一个变量的值是否正确undef.

还有其他几种方式.如果你想赋给变量,如果是undef,你的示例代码似乎表明,你可以,例如,使用Perl的定义,或操作:

$var //= 'a default value';
Run Code Online (Sandbox Code Playgroud)

  • 在Perl 5.10中引入了`//`和`// =`运算符.对于先前版本,`||`和`|| =`运算符执行相同的操作,除非它们将覆盖初始化的"已定义但错误"的值,如"0"或"""`. (12认同)
  • Blrfl:没错.那是你的意思吗?具有undef值的标量与它是否已被初始化完全无关,考虑到perl根本无法区分未初始化的标量和碰巧保持值为"undef"的标量,因为有人将其设置为"undef". (4认同)

vol*_*ron 11

这取决于你想要做什么.正确的C做法是在声明变量时初始化变量; 但是,Perl is not C所以下列之一可能是你想要的:

  1)   $var = "foo" unless defined $var;      # set default after the fact
  2)   $var = defined $var? $var : {...};     # ternary operation
  3)   {...} if !(defined $var);              # another way to write 1)
  4)   $var = $var || "foo";                  # set to $var unless it's falsy, in which case set to 'foo'
  5)   $var ||= "foo";                        # retain value of $var unless it's falsy, in which case set to 'foo' (same as previous line)
  6)   $var = $var // "foo";                  # set to $var unless it's undefined, in which case set to 'foo'
  7)   $var //= "foo";                        # 5.10+ ; retain value of $var unless it's undefined, in which case set to 'foo' (same as previous line)
Run Code Online (Sandbox Code Playgroud)


做事方式(不推荐):

# initialize the variable to a default value during declaration
#   then test against that value when you want to see if it's been changed
my $var = "foo";
{...}
if ($var eq "foo"){
   ... # do something
} else {
   ... # do something else
}
Run Code Online (Sandbox Code Playgroud)

另一种冗长的方法是在变量被更改时创建一个类和一个标志,这是不必要的.


Axe*_*man 5

如果你不在乎它是否为空,那就是.否则你可以检查

if ( length( $str || '' )) {}
Run Code Online (Sandbox Code Playgroud)