Perl:简单的INI文件信息检索

时间:2012-04-04 18:52:19

标签: perl file config ini

我有一个perl脚本正在读取这样的INI文件:

[placeholder_title]
Hostname = 127.0.0.1
Port = 161

我正在使用的库是Config :: Tiny。

通常在阅读ini文件时,我会这样:

$Config = Config::Tiny->read( 'configfile.ini' );

my $Hostname_property = $Config->{placeholder_title}->{Hostname};

现在我有一个案例,配置文件中的节标题是由用户决定的,所以我不知道它是什么。

在我实际在配置文件中有多个部分之前,我会像这样迭代它们:

 foreach my $Section (keys %{$Config}) {

            my $Hostname_property = $Config->{$Section}->{Hostname};
            my $Port_property = $Config->{$Section}->{Port};

但如果我总共只有一节呢?

我是否可以使用特定的关键字替换部分名称?

我尝试过前面例子中类似的循环逻辑:

$Config = Config::Tiny->read( 'configfile.ini' );

my $Section = keys %{$Config};

my $Hostname_property = $Config->{$Section}->{Hostname};

print $Hostname_property, "\n";

但是后来我得到一个$ Hostname_property没有被初始化的错误,所以我的$ Section变量显然没有做我希望它做的事。

如果有人可以帮助我或至少指出我正确的方向,我们将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:4)

my $Section = keys %{$Config};不起作用的原因是您在标量上下文中调用keys,因此返回键的数量。请尝试在列表上下文中调用它:

my ($Section) = keys %{$Config};

这会将$Section设置为第一个键。 (“first”以任何顺序keys返回键。如果只有一个键,则无关紧要。)

答案 1 :(得分:2)

哈希只有一个密钥是可以的。因此,如果你的ini文件中只有一个部分,那也没关系。

例如,如果我们有一个名为blah.ini的文件,其内容为

[title]
foo=bar
blah=baz

如果我们运行以下代码:

use strict;
use warnings;
use Config::Tiny;
my $cfg=Config::Tiny->read("blah.ini");
use Data::Dumper;
print Dumper($cfg) . "\n";

然后我们得到输出

$VAR1 = bless( {
                 'title' => {
                              'blah' => 'baz',
                              'foo' => 'bar'
                            }
               }, 'Config::Tiny' );

因此,我们可以执行以下操作:

use strict;
use warnings;
use Config::Tiny;

my $cfg=Config::Tiny->read("blah.ini");
foreach my $title(sort keys %$cfg)
{
  foreach my $setting (sort keys %{$cfg->{$title}})
  {
    print "title: $title,setting $setting, value $cfg->{$title}->{$setting}\n";
  }
}

输出

title: title,setting blah, value baz
title: title,setting foo, value bar