【问题标题】:Why can't I have a literal list slice right after a print in Perl?为什么我不能在 Perl 中打印后立即获得文字列表切片?
【发布时间】:2009-11-05 20:01:38
【问题描述】:

我知道我可以这样做:

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

【问题讨论】:

  • 请将问题的文本改为关于正在发生的事情的问题。这使得该问题对其他人更有用。
  • 如果您有建议,我很乐意考虑。
  • 这应该在 perlfaq 中。我以为它已经在那里了。 :(

标签: perl unary-operator


【解决方案1】:

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

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

发件人,perldoc -f print

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

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

【讨论】:

  • +1 OP 的print ( 中的空间让他/她失望了。空格并不重要,即使它“看起来”很重要。这不是 Python。
  • 这个警告也适用于任何列表!只是 print 是您最有可能不使用括号的那个,也是您最有可能不小心将括号添加到第一个 arg 的那个。
【解决方案2】:

perldoc for print 包含此块:

还要注意不要在 print 关键字后面加上 一个左括号,除非你想要相应的右括号 括号终止 print--interpose 的参数 一个“+”或在所有参数周围加上括号。

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

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

没问题。但是当你说

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

解析器在看到第一个( 后需要一个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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2013-08-02
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多