代码之家  ›  专栏  ›  技术社区  ›  Richard Simões

为什么不能在Perl中打印后立即进行文本列表切片?

  •  3
  • Richard Simões  · 技术社区  · 15 年前

    我知道我可以这样做:

    print STDOUT (split /\./, 'www.stackoverflow.com')[1];
    

    打印“stackoverflow”。然而,这:

    print +(split /\./, 'www.stackoverflow.com')[1];
    

    做同样的事,这:

    print (split /\./, 'www.stackoverflow.com')[1];
    

    是语法错误。那么这里到底发生了什么?我一直理解一元加号在任何情况下都不做任何事情。如果“print filehandle expr”有效的话,我会想象“print expr”总是同样有效的。有什么见解吗?

    2 回复  |  直到 15 年前
        1
  •  16
  •   Community CDub    8 年前

    您没有启用警告。在 print(...)[1] 例如,括号集被视为函数语法的一部分。

    print (...) interpreted as function at C:\Temp\t.pl line 4.
    

    从, perldoc -f print 以下内容:

    另外,注意不要在print关键字后面加左括号,除非您希望相应的右括号终止print interpose的参数a + 或者在所有参数周围加上括号。

    也见 Why aren't newlines being printed in this Perl code?

        2
  •  8
  •   mob    15 年前

    perldoc 对于 print 包括这个金块:

    也要小心不要跟随打印关键字 左括号,除非需要相应的右括号 括号结束打印参数--插入 在所有参数周围加上“+”或括号。

    打印 总是在列表上下文中计算其参数。

    print (split /\./, 'www.stackoverflow.com')
    

    可以。但当你说

    print (split /\./, 'www.stackoverflow.com')[0]
    

    分析器在看到第一个列表之后需要一个列表 ( ,并认为该列表在看到结束时是完整的 ) . 这个 [0] 不会解释为对任何内容进行操作,因此会出现语法错误。

    print "abc","def";       # prints "abcdef"
    print ("abc","def");     # prints "abcdef"
    print ("abc"), "def";    # prints "abc"
    


    可以将列表作为第一个参数的其他Perl函数的行为方式相同:

    warn ($message),"\n"   # \n not passed to warn, line # info not suppressed
    
    system ("echo"),"x"    # not same as system("echo","x") or system "echo","x"
                           #    or system(("echo"),"x")