perl:设置默认,本地和全局用户设置

时间:2013-03-18 02:37:33

标签: perl module environment-variables

我正在使用perl脚本(myscript.pl),我想按顺序从各个模块加载一些环境变量:

  • 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;

我知道我可以使用

use lib "/home/foo/bar/";
use userSettings;
<{1>}中的

,但我想避免让用户编辑myscript.pl - 主要的希望/目标是让用户编辑以外的文件 {{ 1}}。

我对其他完成相同想法myscript.pl

的工作流程持开放态度

2 个答案:

答案 0 :(得分:3)

不要使用Perl模块来存储配置数据。这不是他们的意思,正如你所看到的,他们并不真正适合这个目的。还存在潜在的安全风险,因为模块包含可执行的Perl,它可以对您的系统执行任何操作。数据更好地存储在非可执行文件中。

相反,使用类似JSON数据文件的东西,这些文件可放在磁盘卷的任何位置,并直接读入Perl数据结构。

你的主要问题似乎是如何定义第三组配置数据的位置,对我来说最明显的选项是它应该在另外两组中的一组中指定 - 可能是当前存储的一组工作目录。

答案 1 :(得分:0)

我想到了两种方法:

  • use lib "$ENV{HOME}/bar";如果您关心的所有内容都不要求用户输入其主目录的路径,但您可以在该目录中假设特定路径。
  • use lib $ENV{MYSCRIPT_CONFIG};如果您愿意要求用户设置该环境变量(尽管如果没有设置它至少会收到警告,所以这不是理想的;您可以改为{{} 1}}阻止它检查是否已设置然后打开 - 编码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: $@" if $@; die "couldn't load $file: $!" unless defined $status; die "couldn't load $file" unless $status; } 的缺点是更详细的错误管理。优点是您不必向模块路径添加内容,您不必特别命名文件,甚至不必为这三种类型的设置文件使用单独的名称防止do处理阻止加载所有配置。

(另一个答案也有一个好处,你应该总是三思而后行使用Perl模块来配置数据,但有时候这是一个非常好的主意。一个是用户配置可以包括完整的用Perl编写的回调函数。我有几个软件包就是这种情况。)