我正在使用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
答案 0 :(得分:3)
不要使用Perl模块来存储配置数据。这不是他们的意思,正如你所看到的,他们并不真正适合这个目的。还存在潜在的安全风险,因为模块包含可执行的Perl,它可以对您的系统执行任何操作。数据更好地存储在非可执行文件中。
相反,使用类似JSON数据文件的东西,这些文件可放在磁盘卷的任何位置,并直接读入Perl数据结构。
你的主要问题似乎是如何定义第三组配置数据的位置,对我来说最明显的选项是它应该在另外两组中的一组中指定 - 可能是当前存储的一组工作目录。
答案 1 :(得分:0)
我想到了两种方法:
use lib "$ENV{HOME}/bar";
如果您关心的所有内容都不要求用户输入其主目录的路径,但您可以在该目录中假设特定路径。use lib $ENV{MYSCRIPT_CONFIG};
如果您愿意要求用户设置该环境变量(尽管如果没有设置它至少会收到警告,所以这不是理想的;您可以改为{{} 1}}阻止它检查是否已设置然后打开 - 编码BEGIN
)的效果。但是,我会提出一个更基本的建议:我认为您实际需要use lib
时使用use
和require
。而不是将所有这些随机路径添加到您的全局模块搜索路径(也将用于您加载的每个其他模块),请考虑以下策略:
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编写的回调函数。我有几个软件包就是这种情况。)