为什么我不能在Perl中打印后立即使用文字列表切片?

Ric*_*ões 3 perl unary-operator

我知道我可以这样做:

print STDOUT (split /\./, 'www.stackoverflow.com')[1];
Run Code Online (Sandbox Code Playgroud)

并打印"stackoverflow".但是,这个:

print +(split /\./, 'www.stackoverflow.com')[1];
Run Code Online (Sandbox Code Playgroud)

做同样的事,这个:

print (split /\./, 'www.stackoverflow.com')[1];
Run Code Online (Sandbox Code Playgroud)

是语法错误.那到底是怎么回事?我总是理解一元加号在任何情况下都不做任何事情.如果"print FILEHANDLE EXPR"有效,我会想象"打印EXPR"总能同样有效.任何见解?

Sin*_*nür 16

您没有启用警告.在这种print(...)[1]情况下,括号集被视为函数语法的一部分.

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

来自,perldoc -f打印:

另外,请注意不要使用左括号跟随print关键字,除非您希望相应的右括号终止print-interpose a + 的参数或在所有参数周围加上括号.

另请参阅为什么不在此Perl代码中打印换行符?

  • +1 OP的'print'中的空格(`正在抛弃他/她.空白并不重要,即使它"看起来"很重要.这不是Python. (9认同)
  • 这个警告也适用于任何listop!只是'print`是你最有可能离开括号的那个,而且你最有可能意外地将parens添加到第一个arg中. (3认同)

mob*_*mob 8

perldocprint包括这块金块:

另外要注意不要使用左括号跟随print关键字,除非您希望相应的右括号终止打印的参数 - 插入"+"或在所有参数周围加上括号.

print 始终在LIST上下文中评估其参数.

要说

print (split /\./, 'www.stackoverflow.com')
Run Code Online (Sandbox Code Playgroud)

没关系.但是当你说的时候

print (split /\./, 'www.stackoverflow.com')[0]
Run Code Online (Sandbox Code Playgroud)

解析器在看到第一个LIST之后需要一个LIST (,并在看到关闭时认为LIST是完整的).将[0]不被解释为对任何工作,所以你得到一个语法错误.

print "abc","def";       # prints "abcdef"
print ("abc","def");     # prints "abcdef"
print ("abc"), "def";    # prints "abc"
Run Code Online (Sandbox Code Playgroud)


其他可以将LIST作为第一个参数的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")
Run Code Online (Sandbox Code Playgroud)