我是Perl编程的新手,我想了解以Perl模块的形式构建一段代码的最佳方法。它应该提供一个框架,使"数据"可以在不影响代码的情况下增长/收缩。
从本质上讲,程序需要执行3件不同的事情("数据"部分):
- 根据主机上安装的RPM(RPM名称分别为"A"、"B"one_answers"C"),从多个文件(整个文本)中收集文本。文件列表将会增长,并且应该存储在一个简单的外部化文件中,该文件应该易于编辑
- 在操作系统(Linux)上运行操作系统命令,并将命令的输出捕获到一个文本文件中,具体取决于主机上安装的RPM(RPM名称="a"、"B"、"C",仅用于参数)
- 在特定数据库上运行Database命令(让我们称之为"DBA"、"DBB"、"DBC",3个数据库对应于3台主机),并将输出捕获到文本文件中,具体取决于主机上安装的RPM(出于参数考虑,RPM名称分别为"a"、"B"one_answers"C")
我需要以这样的方式对逻辑进行编程:
- 必须有一个"RPM到文件/命令/DB命令"的映射,它可以很容易地与主Perl程序分开编辑
- 文件的数量、它们的名称/位置+OS+DB命令预计会发生变化,因此应该可以很容易地与主Perl程序分开编辑
- RPM名称和到上面数据的映射可以更改,因此应该可以很容易地与主Perl程序分开编辑
到目前为止我研究过的想法:
- 哈希的哈希(在Perl模块中)
- 数组数组(在Perl模块中)
- 外部XML
- 外部键值对文件
有什么关于做这件事最简单和最简单的方法的指导吗?说明性代码将是非常有益的。
如何存储配置取决于它的复杂程度,以及没有对系统进行编程的人对它的访问程度。
将配置存储为Perl代码的好处是,解析非常便宜。然而,可能存在安全问题,因为配置文件不会被加载,而是被执行。此外,这是一个可怕的设计。
XML非常灵活,但(a)手动编辑很可怕,(b)处理成本比其他解决方案更高。
如果您的配置数据可以很容易地表示为键值对,那么就这样做吧。否则,看看JSON或YAML,它将为您提供所需的所有功能(大多数情况下)。
我会以这样一种方式编写系统,即在程序开始时加载一个主对象。构造函数将RPM类型作为参数,并处理相应的配置文件。
然后,您将创建一个到此对象的接口,以便处理文本文件、运行系统命令和运行DB查询将使用正确的配置值。
只要确保你的代码美观且通用,这样程序的主要逻辑就不需要知道它使用的是什么RPM,除非在初始化时。
Perl类通常同时也是一个模块。在合理的情况下,根据需要创建辅助模块。
- Perl面向对象编程教程
- YAML文件
- JSON文档
示例构造函数:
package MyObject;
use strict; use warnings; use Carp;
use YAML qw(LoadFile);
my $config_file_dir = "/foo/bar/";
sub new {
my ($class, $type) = @_;
do_rpm_type_sanity_check($type) or confess qq(Invalid type given: $!);
my $self = LoadFile($config_file_dir . $type . ".yaml");
do_config_sanity_check($self) or confess qq(Really weird configuration: $!);
bless $self, $class;
}
示例用法
#!/usr/bin/perl
use strict; use warnings;
use MyObject;
my $type = magically_get_type();
my $obj = MyObject->new($type);
...; # do something useful with the object.