我有一个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变量显然没有做我希望它做的事。
如果有人可以帮助我或至少指出我正确的方向,我们将不胜感激。
谢谢。
答案 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