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

Ade*_*lin 3 macos bash perl

我有一个代码,我想-e从命令行使用perl的选项进行调试.(确切地说,来自Mac OS终端)

当我调用这样的子程序时,我忘了正确匹配双引号,有点像:

perl -e "print lc "Hello-World\n""
#Output: 0
Run Code Online (Sandbox Code Playgroud)

我很惊讶地看到,0但仔细观察后,我发现我的双引号有问题.不出所料,使用外部单引号标记可以解决问题

perl -e 'print lc "Hello-World\n"'
# Output(fixed): hello-world
Run Code Online (Sandbox Code Playgroud)

现在我看到了问题所在,我很好奇地看到它0首先归还了.看起来bash执行了某种减法操作,因为如果我在那里没有破折号重复同样的错误,即使错误的双引号我也没有这个问题:

perl -e "print lc "HelloWorld\n""
                  ^ closing the quotes too soon
#Output: helloworldn
Run Code Online (Sandbox Code Playgroud)

那么为什么这个语法perl -e "print lc "Hello-World\n""打印0?

Sob*_*que 11

有一个有用的技巧可以找出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
Run Code Online (Sandbox Code Playgroud)

这里发生的perl是"看到" Hello - Worldn作为算术总和.因为字符串在数字上为零,所以你要打印0-0.它bashperl处理数值无关,而是与它有关.

这是因为如果您不使用strictwarnings,则可接受裸字,但是通过减法强制转换为数值(例如0)

如果你打开了warnings:

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.
Run Code Online (Sandbox Code Playgroud)