2

Perl 错过了我的 DWIM(三元?:)并强制使用正则表达式。

perl -e "print $bool ?'T' :'F'"
Use of ?PATTERN? without explicit operator is deprecated at -e line 1.
Search pattern not terminated or ternary operator parsed as search pattern at -e
 line 1.

为什么呢?以下两个示例正确解析了三元运算符,

perl -e "print $bool ? 'T' :'F'"
perl -e "print [] ?'T' :'F'"

这是在 Windows 上,但在 *nix 上几乎相同

perl -e 'print $bool ?"T" :"F"'

所以它看起来不像外壳相关。

4

3 回答 3

7

?...?是一个运算符,如此处所示,这里的问题是歧义之一。编译器不知道它看到的是模式还是三元运算符(正如随后的警告所说),所以它猜测,并且猜测错误。

我认为这与print()将其设置为秋季有关,因为它print()具有以下语法:

print FILEHANDLE LIST

因此,它预先确定$bool为文件句柄和?'....语句。然后它注意到这$bool不是一个文件句柄,但是三元组已经在它的错误角色中被转换了。您会注意到以下内容按预期工作:

perl -e"print STDOUT $bool ?'t' :'f'"
于 2013-07-23T11:53:08.363 回答
6

Perl 语法有歧义。

print $bool ?...

可以解析为

print FILEHANDLE LIST

  +----------------- print
  |     +----------- FILEHANDLE
  |     |    +------ LIST (A regex match ?...?)
  |     |    |       
_____ _____ ____
print $bool ?...

或作为

print LIST

  +----------------- print
  |       +--------- LIST (A conditional operator ...?...:...)
  |       |         
_____ __________
print $bool ?...

如果不看得太远,perl就会错误地猜测你的意思是第一个,但让你知道它猜到了。

Search pattern not terminated or ternary operator parsed as search pattern

解决方法:

  • ?在( )之后添加一个空格print $bool ? 'T' :'F';可以使其正确猜测(因为它不再看起来像?...?)。

  • +在文件句柄 ( ) 之前添加 aprint +$bool ?'T' :'F';可以正确猜测(因为它不再是有效的文件句柄表达式)。

  • ?删除( )之前的空格print $bool?'T' :'F';使其猜测正确(因为它不再是有效的文件句柄表达式)。

  • 添加文件句柄 ( print STDOUT $bool ?'T' :'F';) 使其猜测正确(因为$bool现在必须是参数列表的开头)。

于 2013-07-23T13:14:23.433 回答
3

你是在 Windows 上还是在 *nix 上?

在 linux 上,当我切换 " 和 ' ( perl -e 'print $bool ? "T" :"F"') 时,我没有收到任何警告。你编写它的方式$bool是由 shell 插入一个空字符串,你的代码变成perl -e "print ?'T' :'F'"正确触发警告的代码。

于 2013-07-23T11:31:20.123 回答