【问题标题】:Perl: Simple INI file info retrievalPerl:简单的 INI 文件信息检索
【发布时间】:2012-04-18 12:51:40
【问题描述】:

我有一个 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 变量显然没有按照我希望的那样做。

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

谢谢。

【问题讨论】:

    标签: perl file config ini


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案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-12-21
      • 2011-03-29
      • 2012-04-13
      • 2017-09-16
      • 2021-02-09
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 2016-03-08
      相关资源
      最近更新 更多