【问题标题】:Perl Config::SimplePerl 配置::简单
【发布时间】:2013-11-07 02:03:01
【问题描述】:

我有一个 perl 文件,用于查看文件夹中是否存在 ini。如果是,它会从中读取,如果不是,它会根据我为它制作的模板创建一个。

我在 ini 部分使用 Config::Simple。

我的问题是,如果我查找该文件并且它存在,我如何确保其读取的 ini 具有应该存在的所有正确设置名称?

如果 ini 不存在,它将从我的模板中读取,该模板将始终是最新的,但如果我向我的代码添加一个新设置并且它们的 ini 已经存在,我需要能够将新设置添加到他们的。

有什么意见吗?

【问题讨论】:

    标签: perl


    【解决方案1】:

    您可以将 INI 数据加载到哈希中并根据您的要求检查哈希键:

    my %config;
    Config::Simple->import_from('settings.ini', \%config);
    
    my @requirements = qw< foo bar baz quux >;
    
    for ( @requirements ) {  # Verify
        warn( "Parameter '$_' is missing from INI" )
          unless exists $config{$_};
    }
    

    如果您需要覆盖默认设置,将默认设置保存在哈希中将允许您执行此漂亮的单行:

    my %settings = ( %defaults, %config ); # %settings contains defaults + overwrites
    

    为了清晰地分离关注点,人们可能会考虑将其全部放入一个子例程中:

    use Config::Simple;
    
    sub get_settings {
    
        my ( $ini_file ) = @_;
    
        state %defaults = ( foo => 1, bar => 2 );  # 'state' needs Perl 5.10+
        state @requirements = qw< foo bar baz quux >;
    
        my %config;
        Config::Simple->import_from( $ini_file, \%config);
    
        for ( @requirements ) {  # Verify presence of necessary parameters
            next if exists $config{$_};
            warn( "Parameter '$_' is missing from INI" );
            return %defaults;
        }
    
        my %settings = ( %defaults, %config );
    
        return %settings;
    }
    

    【讨论】:

    • 感谢您的回答,这是我的问题/疑虑。我的应用程序将有一个默认的 ini(块、设置和值)。加载应用程序时,它将将该 ini 模板复制到其本地驱动器并从那里运行它。如果我对应用程序进行更新并添加、删除或重命名 ini 设置;我需要对他们的 ini 进行更改。如果设置 [options]Dog=woof 在他们的 ini 上不存在,我需要添加 [options] 及其设置/值。但是,如果确实存在,但狗现在是小狗,我需要更新他们的设置,但将他们自己定义的值保留在那里。这可能吗?
    • 让我重新澄清一下 - 如果该值根本不存在(添加或更改),它将从模板中提取名称/值。如果 A 块不存在,则添加它。如果块下的设置不存在,它们会被添加。如果该块确实存在但有新设置,则将这些设置添加到该块中。这有意义吗?
    • @SBB :您所描述的与我的答案相反,因为您希望默认的Dog 覆盖用户的Dog。如果用户有Cat 而默认没有它,那么它将保持不变。要使默认值覆盖用户设置,您需要类似my %settings = ( %config, %defaults );
    • [Settings] setting1=1 setting2=2 [Options] dog=woof 如果这是他们计算机上的用户 ini,但在我的应用程序中,我将模板定义为:` [Settings] setting1=1 setting2=2 setting3=3 [Options] dog=woof cat=meow [Cars] truck=big` settings3 被添加到设置中,cat 被添加到选项中,并添加了带有卡车设置的新部分汽车。我想要完成的只是确保当我向我的应用程序推送更新时,如果设置不存在,请从模板中提取它。
    • 你为什么不试试我的建议,看看会发生什么?