2013-03-18 40 views
2

我工作的一个perl脚本(myscript.pl),我想加载各种模块的一些环境变量,顺序如下:的Perl:设置默认情况下,局部和整体的用户设置

  • 在默认设置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; 

我知道我可以在myscript.pl使用

use lib "/home/foo/bar/"; 
use userSettings; 

,但我想,以避免用户编辑myscript.pl - 主要希望/目标是让用户编辑比myscript.pl其他文件。

我持开放的态度完成:)

+0

如何使它成为命令行选项? – Scavokovich 2013-03-18 02:43:21

回答

3

不要使用Perl模块存储配置数据同样想法的其他工作流。这不是他们的意思,正如你所看到的,他们并不适合这个目的。模块中包含可执行Perl可能会对系统做任何事情,因此也存在潜在的安全风险。数据更好地存储在不可执行的文件中。

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

您的主要问题似乎是如何定义第三组配置数据的位置,最明显的选择是它应该在其他两组中的一个中指定 - 可能是存储在当前工作目录。浮现在脑海

+0

+1感谢您的反馈:)如您所见,我对'perl'相当陌生......您能构建一个MWE来展示您的建议可能如何实施吗?或以其他方式参考?谢谢! – cmhughes 2013-03-18 15:22:54

0

两种方法:

  • use lib "$ENV{HOME}/bar";如果你关心的是不要求用户输入自己的主目录的路径,但你可以假设该目录内的特定路径。
  • use lib $ENV{MYSCRIPT_CONFIG};如果您愿意要求用户拥有该环境变量集(尽管如果它根本没有设置,至少会收到警告,所以这不是很理想;您可以改为创建一个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: [email protected]" if [email protected]; 
    die "couldn't load $file: $!" unless defined $status; 
    die "couldn't load $file" unless $status; 
} 

do缺点是更详细的错误管理。好处是你不必为模块路径添加东西,你不必特别命名文件,而且你甚至不必为这三种类型的设置文件按顺序使用不同的名称以防止从%INC处理阻止加载所有配置。另一个答案也有一个好处,你应该总是考虑使用Perl模块来处理配置数据,但有些时候这是一个非常好的主意,一个是当用户配置可以包含全双工模式时,用Perl写的回调函数我有几个软件包,在这种情况下)

相关问题