我有一个软件包(实际上只是一个子例程),我经常用来解析配置文件等。基本上看起来像这样:

sub get_settings {
        my %config;
        my $config = 'path...';

        unless(-r $config) {
                die("Couldn't read config");
        }
        open CONFIG, '<', $config or die $!;
        while(<CONFIG>) {
                next if (($_ eq "\n") or /^\;/);
                chomp;
                my($setting, $value) = split(/=/, $_);
                $config{$setting} = $value;
        }
        return %config;
}

非常基本,但我想知道该如何(是否)可以/应该重新编写 哎呀?真的只是为了学习,从未见过何时以及为什么使用 保佑. =)

谢谢!

有帮助吗?

解决方案

问题的答案与您使用的程序包中的程序相比,与软件包本身更多有关。

如果这是一个相当大的基于OOP的应用程序/脚本,那么将其OOP肯定是有意义的,因为这是客户所期望的(应用程序和编写这些应用程序/脚本的人)。还具有命令式库库,就像拇指酸痛一样伸出并产生复杂性。

相反,如果包装在较短的命令脚本中使用,则OOP接口将与客户的期望发生冲突(即脚本 +人开发它们)。

也许您在方法之间迁移(例如,脚本变得大而笨拙,需要更好地组织起来,也许使用OOP)在这种情况下,设置/config的类别是一个很好的起点,因为它们往往是分开的,并且明确的责任感。

简而言之:做最有意义的包裹所在位置。

其他提示

这是(希望!)基于OO的配置抽象的简单示例:

NB。您可以使用其他模块,甚至可以自己滚动。以下是一般示例。

RoomConfig.pm

package RoomConfig;
use Moose;
with 'MooseX::SimpleConfig';

has doors   => (is => 'rw', isa => 'Int', required => 1);
has windows => (is => 'rw', isa => 'Int', default  => sub {0});

1;

因此,上面是我们的OO配置类。一切都整齐地声明了,因此您清楚地知道配置选项可用且有效,即。它的自我记录。

因此要创建一个 room 从配置文件将是:

use RoomConfig;

my $box_room = RoomConfig->new_with_config( configfile => 'box_room.yaml' );

因为它是一个课程,我也可以实例化 room 没有配置文件:

my $cupboard       = RoomConfig->new( doors => 1 );
my $utility_room   = RoomConfig->new( doors => 2 );
my $master_bedroom = RoomConfig->new( 
    doors      => 1,
    windows    => 2,   # dual aspect
);

而且,使用这些特定模块,我们获得了这样的额外功能:

# below throws exception because room must have a door!
my $room_with_no_door_or_window = RoomConfig->new; 

因此,我的配置很容易来自配置文件或设置属性。


我们可以通过扩展不同类型的不同类型的配置来进一步发展 rooms:

浴室Config.pm

package BathRoomConfig;
use Moose;
extends 'RoomConfig';

has loos  => (is => 'rw', isa => 'Int', default  => sub {0});
has sinks => (is => 'rw', isa => 'Int', default  => sub {0});
has baths => (is => 'rw', isa => 'Int', default  => sub {1});

1;

如果我们使用了此配置(浴室.yaml):

doors:  1
windows:    1
bath:   1
loos:   1
sinks:  2

然后,您可以这样做:

use BathRoomConfig;

my $upstairs_bathroom = BathRoomConfig->new_with_config( 
    configfile => 'bathroom.yaml' 
);

my $closet_room = BathRoomConfig->new_with_config( 
    configfile => 'bathroom.yaml',
    baths      => 0,
    sinks      => 1,
    windows    => 0,
);

注意 $closet_room 使用配置文件和设置属性。

另请注意,如果我的配置文件没有 doors (即所需属性)然后,它将在 new_with_config.


最后,我们可能会发现我们定义的配置类方便的内省:

use RoomConfig;

say "RoomConfig provides the following options:";

for my $attr (RoomConfig->meta->get_attribute_list) {
    next if $attr eq 'configfile';
    say '-> ', $attr;
}


现在,没有什么可以阻止您在标准配置软件包中实现大部分的,因此在一天结束时,它只是课程的马匹!

但是,使用OO,管理所有这些的易用性非常容易,并且这些已经书面模块提供的功能是很大的优势,尤其是在更大的项目中。

您可以从CPAN上的模块中查看源代码。例如 config ::常规 应该回答你的问题...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top