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
+的参数或在所有参数周围加上括号.
perldoc对print包括这块金块:
另外要注意不要使用左括号跟随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)