我想爲我的Perl腳本編寫一個輸入文件。
該文件包含我的程序的配置。在Perl中加載配置的最佳方法是什麼?
輸入是在Perl格式:
my $var1 = "/home/moon";
my $var2 = 123;
my $var3 = "output.log";
...
我的問題是,我不知道如何在這種格式加載此配置文件。 任何人都可以幫忙嗎?
我想爲我的Perl腳本編寫一個輸入文件。
該文件包含我的程序的配置。在Perl中加載配置的最佳方法是什麼?
輸入是在Perl格式:
my $var1 = "/home/moon";
my $var2 = 123;
my $var3 = "output.log";
...
我的問題是,我不知道如何在這種格式加載此配置文件。 任何人都可以幫忙嗎?
使用'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。但只要使用'做'即可快速入侵。
我不認爲'do'的變量會影響父進程 – nrathaus
用hashref提及'do'可能會有用。 '{var1 => 1,var2 => 2,..}' –
+1'但是隻要使用'do'即可快速入侵。' – gaussblurinc
只是一個想法,但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
只是一個想法...
是什麼?你在問什麼?解釋:)你是否想使用參數'123'和'output.log'運行程序'/ home/moon'? – nrathaus
這聽起來像你想加載配置。 **不要**將你的配置放在'.pl'文件中。使用模塊進行配置,或者自己推出。加載數據結構。使用像JSON或YAML這樣的格式,但從不加載在您的命名空間中引發變量的文件。它會來和困擾你,10年後你將不知道如何擺脫這些東西。相信我,我知道。 :-D – simbabque
看起來你可能對['Getopt :: Long']感興趣(http://perldoc.perl.org/Getopt/Long.html)。 – devnull