我同意JesperE,请告诉我们一些代码.但是,就我所知,这就是发生的事情:
if(-G) {
Run Code Online (Sandbox Code Playgroud)
Perl看到了这个,无法识别-G,因此将其视为字符串.它成为了:
if('-G') {
Run Code Online (Sandbox Code Playgroud)
这相当于:
if(1) {
Run Code Online (Sandbox Code Playgroud)
据我所知,if(-G)什么都不做.我尝试过使用它,似乎总是回归真实,这支持了我的假设.进一步的支持来自以下代码(在OS X上使用Perl 5.10.0测试):
use strict;
use warnings;
my $var = -G;
print "$var\n";
Run Code Online (Sandbox Code Playgroud)
不显示警告,编译和运行,只打印"-G".
编辑:我应该做更早的搜索,从Perldoc的perlop页面提供以下内容:
如果操作数是数字,则一元" - "执行算术否定.如果操作数是标识符,则返回由与标识符连接的减号组成的字符串.否则,如果字符串以加号或减号开头,则返回以相反符号开头的字符串.这些规则的一个作用是-bareword等同于字符串"-bareword".但是,如果字符串以非字母字符开头(不包括"+"或" - "),Perl将尝试将字符串转换为数字,并执行算术否定.如果字符串不能干净地转换为数字,Perl将给出警告参数"字符串"不是数字否定( - )at ....
正如评论中所述,B::Deparse似乎表明Perl转换if(-G)为if(-'G').但是,文档(及其行为print())与文档一致,即文档应转换if(-G)为if('-G').这不会改变程序的结果.
然而,99%的人只会在数字上使用的一元运算符的行为的细微类型差异并不是我所谓的"基本".我不认为任何人应该(或将永远需要)使用-bareword到'bareword'任何实际情况转换.
| 归档时间: |
|
| 查看次数: |
301 次 |
| 最近记录: |