先来看三个例子:
例1:
my @b;
if (my @c = @b) {
print "truen";
}
else {
print "falsen";
}
# false
例2:
my @b = ();
if (my @c = @b) {
print "truen";
}
else {
print "falsen";
}
# false
例3:
case 1和2都返回假值,打印false,这好像很好理解,空列表和未定义的都是假了。但是对于case 3(打印true),可能会有些confused,怎么undef成了真值了?
if判断语句是标量上下文。
对于case 1和2,数组b中的无素个数为0,在标量上下文中,计算数组的个数为0,为假。
对于case 3,数组b中的元素个数为1,值为undef,在标量上下文中,计算数组的个数为1,就是为真了。
可能会犯的一个设计函数的错误为:
sub get_tags {
if (have tags) {
for ... {
push @tags, $t;
}
return @tags;
}
else { # no tags
return undef;
}
}
if (my @tags = get_tags) {
print ...;
}
else {
print "no tagsn";
}
上面的程序,永远也不会打印no tags。
一个办法是为假时return (), 或直接返回未初始化值,只是后者在复杂的逻辑(如果函数很复杂)中可能不是太明了而已。
sub get_tags {
my @tags = undef;
return @tags;
}
if (my @c = get_tags) {
print "truen";
}
else {
print "falsen";
}
# true
sub get_tags {
my @tags;
return undef;
}
if (my @c = get_tags) {
print "truen";
}
else {
print "falsen";
}
# true
sub get_tags {
my @tags;
return @tags;
}
if (my @c = get_tags) {
print "truen";
}
else {
print "falsen";
}
# false