2012-04-04 44 views
1

我有一個Perl腳本是閱讀INI文件是這樣的:的Perl:簡單的INI文件信息檢索

[placeholder_title] 
Hostname = 127.0.0.1 
Port = 161 

,我使用這個庫是配置::微小。

通常讀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未初始化錯誤,所以我的$變量節顯然沒有做我希望它做的。

如果有人能幫助我,或者至少讓我指向正確的方向,那將是不勝感激。

謝謝。

回答

4

原因my $Section = keys %{$Config};不工作是你調用在標量上下文keys,所以它的返回鍵的數量。嘗試在列表上下文中調用它:

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

這將設置$Section爲第一個鍵。 (以任何順序的「第一」keys正在返回鍵。如果只有一個鍵,那並不重要。)

+0

真棒,它的作品。謝謝。 – user1300922 2012-04-04 19:18:06

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 
+0

我明白了。感謝您的幫助:) – user1300922 2012-04-04 19:19:01