1

我有一个 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};

但是如果我总共只有 1 个部分呢?

是否有一个特定的关键字可以用来代替部分名称?

我已经从前面的示例中尝试过类似的循环逻辑,如下所示:

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

my $Section = keys %{$Config};

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

print $Hostname_property, "\n";

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

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

谢谢你。

4

2 回答 2

4

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

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

这将设置$Section为第一个键。(“第一”以任何顺序keys返回键。如果只有一个键,那没关系。)

于 2012-04-04T19:08:57.610 回答
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
于 2012-04-04T19:01:37.253 回答