我想为我的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