2014-01-20 66 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 

只是一个想法...

相关问题