2014-01-20 63 views
-2

我想爲我的Perl腳本編寫一個輸入文件。
該文件包含我的程序的配置。在Perl中加載配置的最佳方法是什麼?

輸入是在Perl格式:

my $var1 = "/home/moon"; 
my $var2 = 123; 
my $var3 = "output.log"; 
... 

我的問題是,我不知道如何在這種格式加載此配置文件。 任何人都可以幫忙嗎?

+1

是什麼?你在問什麼?解釋:)你是否想使用參數'123'和'output.log'運行程序'/ home/moon'? – nrathaus

+9

這聽起來像你想加載配置。 **不要**將你的配置放在'.pl'文件中。使用模塊進行配置,或者自己推出。加載數據結構。使用像JSON或YAML這樣的格式,但從不加載在您的命名空間中引發變量的文件。它會來和困擾你,10年後你將不知道如何擺脫這些東西。相信我,我知道。 :-D – simbabque

+1

看起來你可能對['Getopt :: Long']感興趣(http://perldoc.perl.org/Getopt/Long.html)。 – devnull

回答

6

使用'do'作爲參數文件的名稱。 Peldoc頁面甚至有一個讀取配置變量文件的例子。

請注意,爲了能夠訪問調用腳本中的變量,您將需要在主程序和用'do'加載的配置文件中使用'our'聲明它們。

更方便的方法是將配置文件的內容設置爲匿名散列,並將其分配給主程序中的變量。然後,您可以參考散列的鍵來獲取各種配置設置。舉個例子:

主要課程:

my $config=do("configfile.pl"); 
die "Error parsing config file: [email protected]" if [email protected]; 
die "Error reading config file: $!" unless defined $config; 

print "Log File: $config->{logfile}\n"; 

configfile.pl

{ 
    logfile => '/home/me/log.txt', 
    someParam => 1234, 
    someFile => '/home/me/some/file', 
} 

另一個要注意的是,加載此類安全文件可以是一個安全隱患。用戶可以在文件中放置任何他們想要的東西,它將作爲perl語句執行!如果加載文件的進程在擁有該文件的用戶以外的用戶下運行,那麼這是特別討厭的 - 例如,如果它將以root身份運行。

cpan上有很多模塊爲配置文件提供更好的解決方案,例如Config::General或Config :: Simple。但只要使用'做'即可快速入侵。

+0

我不認爲'do'的變量會影響父進程 – nrathaus

+0

用hashref提及'do'可能會有用。 '{var1 => 1,var2 => 2,..}' –

+0

+1'但是隻要使用'do'即可快速入侵。' – gaussblurinc

1

只是一個想法,但Data :: Dumper如何和需要?

此配置轉儲到控制檯:

$ perl -le 'use Data::Dumper; 
      $config = { var1 => "/home/moon", 
         var2 => 123, 
         var3 => "output.log", 
      }; 
      print Data::Dumper->Dump([$config],["config"]);' 

___output___ 

$config = { 
      'var3' => 'output.log', 
      'var1' => '/home/moon', 
      'var2' => 123 
      }; 

輸出重定向到 「的config.txt」 文件中使用 「>>」,例如,然後 「規定」 在一個新的文件:

$ perl -MData::Dumper -le 'require "config.txt"; print Dumper($config);' 
$VAR1 = { 
      'var3' => 'output.log', 
      'var1' => '/home/moon', 
      'var2' => 123 
     }; 

...恢復變量可以通過它們的鍵被稱爲:

$ perl -MData::Dumper -le 'require "config.txt"; print "var1: ", $config->{var1};' 
___output___ 
var1: /home/moon 

只是一個想法...

相關問題