短版
是否有可能從使用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
行只有在我的本地副本丟失,原因未知)。它declares和initializes變量$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
行或者
好的,你說得對上游來源的線路是正確的。我錯誤地認爲我的本地副本是相同的。仍然試圖找出我的副本在哪裏。奇怪的,但絕對是一個本地問題。 – MvG