2010-01-21 70 views

回答

8

已經有standard Config module,所以選擇一個不同的名字。

假設你有MyConfig.pm包含以下內容:

package MyConfig; 

our $Foo = "bar"; 

our %Baz = (quux => "potrzebie"); 

1; 

然後其他模塊可以使用它作爲

#! /usr/bin/perl 

use warnings; 
use strict; 

use MyConfig; 

print "Foo = $MyConfig::Foo\n"; 

print $MyConfig::Baz{quux}, "\n"; 

如果你不想完全限定的名稱,然後使用標準Exporter模塊。

添加三行MyConfig.pm

package MyConfig; 

require Exporter; 
our @ISA = qw/ Exporter /; 
our @EXPORT = qw/ $Foo %Baz /; 

our $Foo = "bar"; 

our %Baz = (quux => "potrzebie"); 

1; 

現在全包的名稱不再是必要的:

#! /usr/bin/perl 

use warnings; 
use strict; 

use MyConfig; 

print "Foo = $Foo\n"; 

print $Baz{quux}, "\n"; 

你可以添加一個只讀標量MyConfig.pm

our $READONLY; 
*READONLY = \42; 

這記錄在perlmod

將它添加到@MyConfig::EXPORT後,你可以嘗試

$READONLY = 3; 

在不同的模塊,但你會得到

Modification of a read-only value attempted at ./program line 12.

作爲替代方案,你可以在MyConfig.pm常量使用constant聲明然後導出這些模塊。

+2

與其從'Exporter'繼承,不如從'import'方法,這是你真正需要的。例如'使用Exporter'import';' – friedo 2010-01-21 15:04:10

4

不要使用全局變量進行配置,也不要將配置作爲代碼使用。關於這一點,我有一整章Mastering Perl

取而代之,創建一個配置類,其他任何包都可以使用該配置類來訪問配置數據。從長遠來看,爲你可能想要改變的事情提供一個界面比通過散佈你必須支持你的餘生的變量名稱來處理你鎖定自我的瘋狂更容易。

配置接口還可以通過組合實際配置數據的正確位來爲配置問題提供新答案。你將所有這些隱藏在一個方法的後面,而更高層次不必看到它是如何實現的。例如,

print "Hello!" unless $config->be_silent; 

be_silent答案可以觸發多種原因的更高級別的代碼並不需要了解。它可能來自用戶開關,程序檢測到它不是交互式的,等等。它也可以通過諸如調試開關之類的選項來翻轉,該開關覆蓋所有其他偏好。不管你做什麼決定,代碼行都不會改變,因爲該陳述只關心答案,而不是你如何得到答案。

相關問題