我被要求研究将一堆 ksh 脚本转换为 perl。现在所有系统变量都是从一个通用文件(url、数据库用户名等)中导出的。
我的问题是在 perl 中处理这些变量的最佳方法是什么?
PS。我喜欢使用 ini 文件的想法,但是我需要一个 ini 文件阅读库(这里的人不会喜欢)。
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
对常量进行分类,并避免过多地污染调用包的命名空间。
我会使用与您的 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
}
您可以使用配置文件并在需要时将其读取。
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'.