作者:antingwolf | 来源:互联网 | 2022-12-02 11:50
我有一个代码,我想-e
从命令行使用perl的选项进行调试.(确切地说,来自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?
1> Sobrique..:
有一个有用的技巧可以找出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)
如果你打开了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.