2013-01-07 53 views
2

短版

是否有可能從使用BEGIN代碼塊中不合格的名稱聲明爲our模塊訪問的變量,但外面使用限定的名字呢?特別是,這可以做沒有明確命名模塊文件中的包?封裝名

demomod.pm

use strict; 
use warnings;  
package demomod; 
our $foo; 
BEGIN { $foo = 42; } 
1; 

demoscript.pl

#!/usr/bin/perl -Tw 
use strict; 
use warnings; 
BEGIN { @INC = ('.', @INC); } 
use demomod; 
print $demomod::foo."\n"; 

在這種情況下,所有的名字一致,並且一切正常,因爲它應該。有沒有一種方法可以從demomod.pm代碼中省略行package demomod;並仍然讓這個工作?

動機

爲什麼我問的原因是因爲我最近的Foswiki升級過程中遇到的東西沿着這些路線。該軟件有一個模塊Foswiki.pm它沒有一個package(編輯:似乎package行只有在我的本地副本丟失,原因未知)。它declaresinitializes變量$engine就像我的例子。還有一個名爲view的CGI腳本,它設置@INC,然後是use Foswiki();,然後是$Foswiki::engine->run()。最後一行總是失敗,對我來說,由於未初始化變量:

Can't call method "run" on an undefined value at …/view 

在模塊的BEGIN塊,$engine設置正確,但顯然$Foswiki::engine不是。所以看起來這裏有兩個變量,一個是合格的,另一個是不合格的。

所有代碼顯然適用於其他人,以前的版本也適用於我,沒有package行或者。所以,當我試圖理解這是如何破壞的時候,我也試圖理解這之前如何工作,沒有這條線。是否有一些機制可以使這項工作?

回答

3

如果您的代碼中沒有package聲明,則任何包變量將聲明爲main包。所以不,你不能做你描述的。

如果你看鏈接的Foswiki代碼的第2行,你會發現它確實有有一個包語句。

+0

好的,你說得對上游來源的線路是正確的。我錯誤地認爲我的本地副本是相同的。仍然試圖找出我的副本在哪裏。奇怪的,但絕對是一個本地問題。 – MvG