bash - 为什么 perl -e "print lc "Hello-World\n""打印 0

标签 bash macos perl

我有一个代码,我想在命令行中使用 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

这里发生的事情是 perlHello - Worldn “视为”算术和。因为字符串在数值上为零,所以您正在打印 0-0。它与 bash 无关,而是与 perl 及其处理数值的方式有关。

这是因为如果您不使用 strictwarnings,裸词是可以接受的,但会被减法强制转换为数值(例如 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/

相关文章:

Bash - 计算文本文件中出现的次数并按降序显示

android - .bash_profile 破坏了我的路径,但是 .bashrc

macos - Docker GUI 与 Mac 如何

linux - Elasticsearch安装错误: No such file or directory

linux - 引用包含引号并在 Bash 中作为变量给出的文件名

linux - 检查特定路径下的程序是否正在运行

swift - NSWindow 位置

正则表达式范围运算符

perl - 从Unix域套接字读取一行

mysql - Catalyst 创建架构无法连接,但我可以