全局符号需要显式包名称

时间:2010-06-29 14:01:19

标签: perl

全局符号需要显式包名吗?为什么会发生这种情况以及可能导致此错误的各种情况?

6 个答案:

答案 0 :(得分:25)

以前的陈述未完成时也可能发生。

use strict;

sub test;

test()

# some comment
my $x;

perl现在抱怨以下错误消息:

my "
Global symbol "$x" requires explicit package name

错误不在“我的”声明中,而是在;处缺少的分号(test())。

答案 1 :(得分:23)

查看perldiag

  

全局符号“%s”需要显式包名称

     

(F)你说过“use strict”或“use strict vars”,它表示所有变量必须是词法范围(使用“my”或“state”),事先使用“our”声明,或者显式限定说明全局变量所在的包(使用“::”)。

答案 2 :(得分:6)

为了明确说明代码中的原因,您需要发布代码。

错误 输出 ,您的脚本已停止,因为您已获得use strict或其衍生产品。 错误 发生 ,因为您的程序正在调用超出范围的变量。

  1. 您可能在子过程/函数中使用了我的或本地,但是尝试在另一个过程中或在函数调用之外使用它。

     sub foo{
        my $bar=0; 
        our ($soap) = 1;
     }
     foo();
     print $bar        , "\n";  # does not work w/ strict -- bar is only in the scope of the function, not globally defined
     print $main::bar  , "\n";  # will run, but won't be populated
     print $soap       , "\n";  # does not work w/ strict -- the package isn't defined
     print $main::soap , "\n";  # will run and work as intended because of our
    

答案 3 :(得分:0)

使用不带use feature "state"use v5.10的状态变量,除非关键字写为CORE :: state。

取自http://perldoc.perl.org/functions/state.html

答案 4 :(得分:0)

事实上,如果您在语句结尾处使用use strict;而某处错过;,则以下语句(它们具有完美语法)可能会引发全局符号需要显式包名称

答案 5 :(得分:-1)

您正在使用use strict;语句,这意味着您的代码必须符合编写perl命令的规定。