perl列表上下文中的函数返回假值的处理方法

发布时间:2019-08-27编辑:脚本学堂
perl列表上下文中的函数返回假值的处理方法

先来看三个例子:
例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:
 

复制代码 代码如下:
my @b = undef;
if (my @c = @b) {
    print "truen";
}
else {
    print "falsen";
}
# true

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