2010-06-29 177 views
24

全局符號需要顯式包名?爲什麼會發生這種情況,以及可能導致此錯誤的各種情況是什麼?全局符號需要顯式包名

+1

示例Perl代碼?請參閱http://stackoverflow.com/q/4257179/10468或在perl模塊上搜索問題。另請參見(異地)http://www.sitepoint.com/forums/showthread.php?501379-Perl-require-and-variables – DarenW 2012-04-12 17:31:42

回答

22

看一看perldiag

全球符號 「%s」 需要明確的包名

(F)你說: 「使用嚴格」 或 「使用嚴格瓦爾」這表明所有變量必須是詞法範圍的(使用「my」或「state」),事先使用「our」聲明,或明確限定全局變量所在的包(使用「::」)。

5

爲了具體說明是什麼導致它在你的代碼中,你需要發佈你的代碼。

的錯誤是輸出和你的腳本停止,因爲你有use strict或它的衍生物。 錯誤發生因爲您的程序正在調用超出範圍的變量。

  1. 您可能在子程序/函數中使用了my或local,但正試圖在另一個程序或函數調用之外使用它。

    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 
    
-1

您正在使用use strict;聲明意味着你的代碼必須是書面形式的Perl命令的規定之內。

+2

寫入Perl命令的哪些規定被違反? – alex 2017-07-18 18:32:15

23

當以前的陳述未完成時也可能發生。

use strict; 

sub test; 

test() 

# some comment 
my $x; 

的Perl現在抱怨與以下錯誤消息:

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

的錯誤不是在宣告 「我的」,但在在test()缺少分號(;)。

+2

謝謝!我正在撕掉我的頭髮。 – Zack 2016-09-01 23:52:35

0

其實兩者,如果你使用use strict;和地方你在聲明的結尾錯過;,那麼下面的語句(他們有完善的語法)可能會提高全局符號需要明確包名以及。