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

时间:2010-09-17 20:35:01

标签: perl

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

my $var;

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

# Is this the correct way?
if (defined $var) {
    ...
}

5 个答案:

答案 0 :(得分:33)

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

但是,默认情况下,未使用某些值显式初始化的标量变量的值恰好为undef。您defined是检查变量值是否为undef的正确方法,您是对的。

还有其他几种方式。如果要分配给变量,如果它是undef,您的示例代码似乎表明,您可以使用perl的defined-or运算符:

$var //= 'a default value';

答案 1 :(得分:10)

这取决于你想要做什么。正确的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)


C方式(不推荐):

# 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
}

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

答案 2 :(得分:5)

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

if ( length( $str || '' )) {}

答案 3 :(得分:3)

这取决于你对变量的计划是否定义;从Perl 5.10开始,你可以这样做(来自perl51000delta):

  

已实施新的运营商//(已定义或)。以下表达式:

 $a // $b
     

仅相当于

defined $a ? $a : $b
     

和陈述

$c //= $d;
     现在可以使用

代替

$c = $d unless defined $c;

答案 4 :(得分:1)

如果变量具有实数值,

'defined'将返回true。

顺便说一句,在哈希中,这可能是真的:

if(exists $h{$e} && !defined $h{$e})