1

次のような INI ファイルを読み取る perl スクリプトがあります。

[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キーが返されます。キーが1つしかない場合は、それは問題ではありません。)

于 2012-04-04T19:08:57.610 に答える
2

ハッシュのキーは 1 つだけでもかまいません。したがって、ini ファイルにセクションが 1 つしかなくても問題ありません。

たとえば、次の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 に答える