我有一个代码,我想-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.它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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
190 次 |
| 最近记录: |