我有一个代码,我想在命令行中使用 perl 的 -e
选项进行调试。 (确切地说,来自 Mac OS 终端)
当我调用这样的子程序时,我忘记了正确匹配双引号,有点像这样:
perl -e "print lc "Hello-World\n""
#Output: 0
我很惊讶地看到 0
,但仔细观察后,我发现我的双引号有问题。毫不奇怪,使用外部单引号可以解决问题
perl -e 'print lc "Hello-World\n"'
# Output(fixed): hello-world
现在我看到了问题所在,我很想知道它首先返回了 0
。看起来 bash 执行了某种减法操作,因为如果我因为没有破折号而重复同样的错误,即使双引号错误,我也不会遇到这个问题:
perl -e "print lc "HelloWorld\n""
^ closing the quotes too soon
#Output: helloworldn
那么为什么这个语法 perl -e "print lc "Hello-World\n""
打印 0?
最佳答案
有一个有用的技巧可以找出 perl 正在“思考”什么。
运行 perl -MO=Deparse -e "print lc "Hello-World\n""
perl -MO=Deparse -e "print lc "Hello-World\n""
print lc 'Hello' - 'Worldn';
-e syntax OK
这里发生的事情是 perl
将 Hello - Worldn
“视为”算术和。因为字符串在数值上为零,所以您正在打印 0-0
。它与 bash
无关,而是与 perl
及其处理数值的方式有关。
这是因为如果您不使用 strict
和 warnings
,裸词是可以接受的,但会被减法强制转换为数值(例如 0)
如果您打开了警告
:
perl -Mwarnings -e "print lc "Hello-World\n""
Argument "Worldn" isn't numeric in subtraction (-) at -e line 1.
Argument "Hello" isn't numeric in subtraction (-) at -e line 1.
关于bash - 为什么 perl -e "print lc "Hello-World\n""打印 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52817003/