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

为什么在这个Perl示例中定义的sdf返回true?

  •  3
  • Aftershock  · 技术社区  · 15 年前

    我在Perl中尝试了这个示例。有人能解释为什么这是真的吗?

      if (defined sdf)  {   print "true";  }
    

    它打印 true .

    自卫队可以是任何名字。

    此外,如果定义了sdf函数并返回0,则不会打印任何内容。

    print (sdf); 不打印sdf字符串,但

    if (sdf eq "sdf")
    {
     print "true";
    }
    

    如果sdf是字符串,则相关问题仍然存在。什么不是印刷品?

    5 回复  |  直到 15 年前
        1
  •  10
  •   Sinan Ünür    15 年前

    sdf 是一个 bareword .

    perl -Mstrict -e "print qq{defined\n} if defined sdf"
    
    Bareword "sdf" not allowed while "strict subs" in use at -e line 1.
    Execution of -e aborted due to compilation errors.
    

    要获得更多乐趣,请尝试

    perl -Mstrict -e "print sdf => qq{\n}"
    

    看见 Strictly speaking about use strict :

    use strict的SUB方面禁止将“裸词”解释为文本字符串。默认情况下,不是内置关键字或以前看到的子例程定义的Perl标识符(字母、数字和下划线序列,除非完全是数字,否则不以数字开头)将被视为带引号的文本字符串:

    @daynames = (sun, mon, tue, wed, thu, fri, sat);
    

    但是,这被认为是一种危险的做法,因为模糊的错误可能会导致:

    @monthnames = (jan, feb, mar, apr, may, jun,
                   jul, aug, sep, oct, nov, dec);
    

    你能发现虫子吗?是的,第10个条目不是字符串“oct”,而是对内置函数的调用 oct() $_ 作为八进制数处理。

    更正:

    E:\Home> perl -we "print sdf"
    Unquoted string "sdf" may clash with future reserved word at -e line 1.
    Name "main::sdf" used only once: possible typo at -e line 1.
    print() on unopened filehandle sdf at -e line 1.
    

    如果一个裸字被提供给 print 打印 默认为打印 $_ 文件处理 . 自从 自卫队

    E:\Home> perl -MO=Deparse -e "print sdf"
    print sdf $_;
    

    作为对这一观察的确认。另请注意:

    E:\Home> perl -e "print asdfg, sadjkfsh"
    No comma allowed after filehandle at -e line 1.
    
    E:\Home> perl -e "print asdfg => sadjkfsh"
    asdfgsadjkfsh
    

    =>

    所有这些例子都表明使用空话会带来很多惊喜。你应该 use strict

        2
  •  5
  •   Tim Palak Chaudhary    15 年前

    这是一个“ bareword ". 如果允许,则其值为 "sdf" ,因此不是未定义的。

        3
  •  4
  •   Telemachus MrJames    15 年前

    这个例子并不特别:

    telemachus ~ $ perl -e 'if (defined sdf) { print "True\n" };'
    True
    telemachus ~ $ perl -e 'if (defined abc) { print "True\n" };'
    True
    telemachus ~ $ perl -e 'if (defined ccc) { print "True\n" };'
    True
    telemachus ~ $ perl -e 'if (defined 8) { print "True\n" };'
    True
    

    这些都不等于 undef 那是什么 defined 检查。

    您可能想查看这篇关于Perl中的真相的文章: What is Truth?

        4
  •  3
  •   Sinan Ünür    15 年前
        5
  •  0
  •   EmFi    15 年前

    除非参数中传递的值未定义,否则定义的函数将返回true。这对于区分包含0或“”的变量和刚刚存在的变量非常有用。

    推荐文章