代码之家  ›  专栏  ›  技术社区  ›  kal

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

  •  32
  • kal  · 技术社区  · 14 年前

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

    my $var;
    
    if (cond) {
        $var = "string1";
    }
    
    # Is this the correct way?
    if (defined $var) {
        ...
    }
    
    5 回复  |  直到 8 年前
        1
  •  35
  •   ysth    14 年前

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

    undef 默认情况下。你说得对 defined 是检查变量值是否为的正确方法 未定义

    还有其他几种方法。如果你想分配给变量 未定义 ,您的示例代码似乎表明了这一点,例如,您可以使用perl的定义or运算符:

    $var //= 'a default value';
    
        2
  •  13
  •   vol7ron    12 年前

    这取决于你想做什么。适当的 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
    }
    

        3
  •  5
  •   Axeman maxelost    14 年前

    如果你不在乎它是否是空的,它是空的。否则你可以查一下

    if ( length( $str || '' )) {}
    
        4
  •  3
  •   Peter Mortensen icecrime    8 年前

    perl51000delta ):

     $a // $b
    

    仅仅等同于

    defined $a ? $a : $b
    

    以及声明

    $c //= $d;
    

    现在可以用来代替

    $c = $d unless defined $c;
    
        5
  •  1
  •   msbmsb    14 年前

    另一方面,在散列中,这可能是真的:

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