以下是使用defined
检查标量变量是否在Perl中初始化的最佳方法吗?
my $var;
if (cond) {
$var = "string1";
}
# Is this the correct way?
if (defined $var) {
...
}
答案 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})