-CONSTANT的模糊使用解析为 - & CONSTANT()

时间:2014-04-22 09:24:50

标签: perl

我正在尝试在我的Perl脚本中将幻数声明为常量,如perlsub中所述。但是,我收到警告:

$ cat foo.perl
use warnings ; use strict ;
sub CONSTANT() { 5 }
print 7-CONSTANT,"\n" ;
$ perl foo.perl
Ambiguous use of -CONSTANT resolved as -&CONSTANT() at foo.perl line 3.
2
$ 

如果我在减号和CONSTANT之间插入一个空格,警告就会消失。它使表达式比我想要的更通风,但它确实有效。

但是,我很好奇:它警告我的含糊不清是什么?我不知道可以解析任何其他方式。

(来自Debian的Perl 5.10.1“挤压”)。

2 个答案:

答案 0 :(得分:7)

首先,一些背景知识。让我们看一下以下内容:

$_ = -foo;

-foo是字符串文字 [1]

$ perl -Mstrict -wE'say -foo;'
-foo

除非已声明名为foo的子目录。

$ perl -Mstrict -wE'sub foo { 123 } say -foo;'
Ambiguous use of -foo resolved as -&foo() at -e line 1.
-123

现在回到你的问题。警告是错误的。 TERM(7)不能跟随另一个TERM,因此-不能是字符串文字或一元减号运算符的开头。 必须是减法运算符,因此没有歧义

此警告仍在5.20.0 [2] 中发出。我已经提交了bug report


  1. 看看马!没有引号!

    system(grep => ( -R, $pat, $qfn ));
    
  2. 好吧,5.20.0还没有出来,但是我们正处于冻结代码冻结状态。这不会在5.20.0中修复。

答案 1 :(得分:1)

mpapec的回答有助于引用perldiag(我不知道),但引用了错误的诊断。我实际得到的是

  

Ambiguous use of -%s resolved as -&%s()

     

(S模棱两可)你写了类似-foo的东西,可能是字符串“-foo”,或者函数foo的调用,否定了。如果你的意思是字符串,只需写“-foo”。如果你的意思是函数调用,请写-foo()。

显然,关键是-CONSTANT是一个有效的裸字。我不知道他们可以用破折号开始。

我仍然不明白为什么会在这里发出警告,因为(a)我正在使用strict subs所以显然我不会刻意抛出简单的话,而且(b)甚至如果我是,那么这个位置的裸字或字符串无论如何都会出现语法错误。

编辑:正如bybyink指出的那样(或多或少),实际上-CONSTANT本身并不是一个裸字,但strict subs仍然允许裸字一元减号运算符。显然,词法分析器不具有上下文感知能够知道在此上下文中不允许将-CONSTANT解析为一元减号。

对我来说仍然感到很奇怪 - 人们会认为没有参数的原型制作的原因应该是我故意放弃使用该名称作为一个简单的,无论它是否恰好是作为一元减去或在不同背景下的操作数。