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

时间:2009-11-05 20:01:38

标签: perl unary-operator

我知道我可以这样做:

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

和“stackoverflow”打印。但是,这个:

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

做同样的事,并且:

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

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

2 个答案:

答案 0 :(得分:16)

您没有启用警告。在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?

答案 1 :(得分:8)

perldoc的{​​{1}}包含此金块:

  

另外请注意不要使用print关键字   左括号,除非你想要相应的权利   括号来终止打印的参数 - 插入   一个“+”或括号括起所有参数。

print总是在LIST上下文中计算其参数。

print

没问题。但是当你说

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

解析器在看到第一个print (split /\./, 'www.stackoverflow.com')[0] 后需要LIST,并在看到结束(时认为LIST是完整的。 )不会被解释为对任何内容进行操作,因此会出现语法错误。

[0]

<小时/>

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

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