3

我看到我可以做这样的事情:

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”总是同样有效。有什么见解吗?

4

2 回答 2

16

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

print (...) 在 C:\Temp\t.pl 第 4 行被解释为函数。

perldoc -f print

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

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

于 2009-11-05T20:08:56.840 回答
8

perldocforprint包括这个金块:

还要注意不要在 print 关键字后面加上左括号,除非您希望相应的右括号终止 print 的参数——插入一个“+”或在所有参数周围加上括号。

print总是在 LIST 上下文中评估它的参数。

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

没关系。但是当你说

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

解析器在看到第一个 LIST 后期望得到一个 LIST (,并在看到结束时认为 LIST 是完整的)。不会被[0]解释为对任何东西进行操作,因此您会收到语法错误。

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


可以将 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")
于 2009-11-05T20:19:12.973 回答