在perl中处理项目级变量的最佳方法是什么

在perl中处理项目级变量的最佳方法是什么,perl,oop,Perl,Oop,我被要求研究如何将一堆ksh脚本转换成perl。现在,所有系统变量都是从一个公共文件(URL、数据库用户名等)导出的 我的问题是在perl中,处理这些变量的最佳方法是什么 另外,我喜欢使用ini文件,但我需要一个ini文件阅读库(这里的人不喜欢) 我将使用与您的ksh脚本类似的概念 创建一个公共包文件,其中所有设置都作为包our变量。 e、 g.ProjConfig.pm包含 package ProjConfig; use strict; use warnings; our $BaseUrl

我被要求研究如何将一堆ksh脚本转换成perl。现在,所有系统变量都是从一个公共文件(URL、数据库用户名等)导出的

我的问题是在perl中,处理这些变量的最佳方法是什么


另外,我喜欢使用ini文件,但我需要一个ini文件阅读库(这里的人不喜欢)

我将使用与您的ksh脚本类似的概念

创建一个公共包文件,其中所有设置都作为包
our
变量。 e、 g.
ProjConfig.pm
包含

package ProjConfig;

use strict;
use warnings;

our $BaseUrl = 'http://www.fred.com/';
our $DbName = 'TheDB';

1;
#!/usr/bin/perl

use strict;
use warnings;

use ProjConfig;

{
    my $db = someConnectFunction( $ProjConfig::DbName );
    # do stuff
}
然后您的调用代码简单地引用这些具有限定名称的变量。 e、 g.
program.pl
包含

package ProjConfig;

use strict;
use warnings;

our $BaseUrl = 'http://www.fred.com/';
our $DbName = 'TheDB';

1;
#!/usr/bin/perl

use strict;
use warnings;

use ProjConfig;

{
    my $db = someConnectFunction( $ProjConfig::DbName );
    # do stuff
}

您可以使用配置文件,并在需要时随时读取它

use Config::Merge;

my $config = Config::Merge->new ( '/path/to/config_file.yml' );

my $file = $config->C('filename');
这将读取一个yaml配置文件,该文件将生成yaml 结构作为perl哈希可用

yaml文件可能类似于:

db:
  name: db_name
  url : 192.168.1.1 
回到文件中:

print $file->{db}{name}  would print out 'db_name'.

为了扩展我的评论,下面是一个示例配置模块
MyConfig.pm
,它导出两个常量

package MyConfig;

use strict;
use warnings;

use base 'Exporter';

our @EXPORT = ( qw/ URL USERNAME / );

use constant URL => 'http:/domain.com/';
use constant USERNAME => 'myuser';

1;
以及使用它的程序文件

use strict;
use warnings;

use MyConfig;

print URL, "\n";
print USERNAME, "\n";
输出

http:/domain.com/
myuser

如果您阅读了,您将看到如何使用
@EXPORT\u OK
%EXPORT\u标记
对常量进行分类,避免过多地污染调用包的名称空间。

Config::Any将愉快地使用INI文件(和许多其他常见格式),并让这里的人们感到高兴。;)或者,如果您愿意,可以使用来读取
.ini
格式化文件。@Bill:如果您的公司不喜欢配置模块,那么很难猜测您有哪些可用选项。你可以把
Config/Tiny.pm
放到你的程序目录中,告诉他们是你自己写的!否则,我建议使用一个Perl模块,比如说
MyConfig.pm
,该模块将
Exporter
子类化,并导出所有常量。这看起来像是对名称空间的大量污染。@daotoad:尽可能少或多。您可以选择导入所有内容,也可以不导入任何内容,并将值引用为
MyConfig::URL
等。