2013-03-18 73 views
2

我工作的一個perl腳本(myscript.pl),我想加載各種模塊的一些環境變量,順序如下:的Perl:設置默認情況下,局部和整體的用戶設置

  • 在默認設置defaultSettings.pm在同一目錄myscript.pl
  • userSettings.pm別的地方(可選),用戶設置,用戶可以在當前工作目錄中選擇
  • (可選)在本地設置localSettings.pm

我已經解決了我的第一個和最後一個項目符號,但沒有成功解決第二個問題。

myscript.pl

#!/usr/bin/perl 

use strict; 
use warnings; 
use FindBin;    
use lib $FindBin::Bin; 

# defaultSettings always present in same directory as myscript.pl 
use defaultSettings; 

# localSettings sometimes present (in current working directory) 
eval 
{ 
    require localSettings; 
     localSettings->import(); 
    }; 

print "Some variable is: ",$someVariable; 
exit 

defaultSettings.pm

package defaultSettings; 

use strict; 
use warnings; 
use Exporter; 

use vars qw($VERSION @ISA @EXPORT); 

$VERSION  = 1.00; 
@ISA   = qw(Exporter); 
@EXPORT  = qw($someVariable 
       ); 

our $someVariable="default settings"; 
1; 

localSettings.pm

package localSettings; 

use strict; 
use warnings; 
use Exporter; 

use vars qw($VERSION @ISA @EXPORT); 

$VERSION  = 1.00; 
@ISA   = qw(Exporter); 
@EXPORT  = qw($someVariable 
       ); 

our $someVariable="local settings"; 
1; 

我知道我可以在myscript.pl使用

use lib "/home/foo/bar/"; 
use userSettings; 

,但我想,以避免用戶編輯myscript.pl - 主要希望/目標是讓用戶編輯比myscript.pl其他文件。

我持開放的態度完成:)

+0

如何使它成爲命令行選項? – Scavokovich 2013-03-18 02:43:21

回答

3

不要使用Perl模塊存儲配置數據同樣想法的其他工作流。這不是他們的意思,正如你所看到的,他們並不適合這個目的。模塊中包含可執行Perl可能會對系統做任何事情,因此也存在潛在的安全風險。數據更好地存儲在不可執行的文件中。

而是使用類似JSON數據文件的文件,這些文件可以放在磁盤卷的任何位置,並直接讀入Perl數據結構。

您的主要問題似乎是如何定義第三組配置數據的位置,最明顯的選擇是它應該在其他兩組中的一箇中指定 - 可能是存儲在當前工作目錄。浮現在腦海

+0

+1感謝您的反饋:)如您所見,我對'perl'相當陌生......您能構建一個MWE來展示您的建議可能如何實施嗎?或以其他方式參考?謝謝! – cmhughes 2013-03-18 15:22:54

0

兩種方法:

  • use lib "$ENV{HOME}/bar";如果你關心的是不要求用戶輸入自己的主目錄的路徑,但你可以假設該目錄內的特定路徑。
  • use lib $ENV{MYSCRIPT_CONFIG};如果您願意要求用戶擁有該環境變量集(儘管如果它根本沒有設置,至少會收到警告,所以這不是很理想;您可以改爲創建一個BEGIN塊,以檢查它是否爲設置然後打開編碼use lib的效果)。

不過,我會做一個更基本的建議:我認爲你正在使用userequire當你真正想要do。而不是將所有的隨機路徑到全局模塊搜索路徑,這將被用於加載以及所有其它模塊,可以考慮像一個策略:

if ($ENV{HOME} && -f "$ENV{HOME}/bar/localSettings.pm") { 
    my $file = "$ENV{HOME}/bar/localSettings.pm"; 
    my $status = do $file; 
    die "couldn't parse file $file: [email protected]" if [email protected]; 
    die "couldn't load $file: $!" unless defined $status; 
    die "couldn't load $file" unless $status; 
} 

do缺點是更詳細的錯誤管理。好處是你不必爲模塊路徑添加東西,你不必特別命名文件,而且你甚至不必爲這三種類型的設置文件按順序使用不同的名稱以防止從%INC處理阻止加載所有配置。另一個答案也有一個好處,你應該總是考慮使用Perl模塊來處理配置數據,但有些時候這是一個非常好的主意,一個是當用戶配置可以包含全雙工模式時,用Perl寫的回調函數我有幾個軟件包,在這種情況下)

相關問題