1

我被要求研究将一堆 ksh 脚本转换为 perl。现在所有系统变量都是从一个通用文件(url、数据库用户名等)中导出的。

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

PS。我喜欢使用 ini 文件的想法,但是我需要一个 ini 文件阅读库(这里的人不会喜欢)。

4

3 回答 3

3

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

如果您阅读有关文档,Exporter您将了解如何使用@EXPORT_OK%EXPORT_TAGS对常量进行分类,并避免过多地污染调用包的命名空间。

于 2012-07-09T16:58:52.817 回答
0

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

创建一个通用包文件,其中包含所有设置作为包our变量。例如ProjConfig.pm包含

package ProjConfig;

use strict;
use warnings;

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

1;

然后,您的调用代码只需使用限定名称引用这些变量。例如program.pl包含

#!/usr/bin/perl

use strict;
use warnings;

use ProjConfig;

{
    my $db = someConnectFunction( $ProjConfig::DbName );
    # do stuff
}
于 2012-07-09T16:24:00.740 回答
0

您可以使用配置文件并在需要时将其读取。

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'.
于 2012-07-09T16:40:37.790 回答