Perl:迭代INI文件

时间:2012-03-29 14:22:15

标签: perl file iteration config ini

我正在创建一个需要读取并获取INI文件值的Perl脚本。

INI文件格式:

[name]
Property=value

示例:

[switch_6500]
cpu=1.5.1.12.4
free_memory=1.45.32.16

[oracle_db_11g]
param1=value1
param2=value2
param3=value3
param4=value4
...

如您所见,可以有任意数量的部分,其中包含任意数量的参数。部分名称/参数的名称将始终不同。

我需要做的是让我的Perl脚本遍历每个部分,并获取该部分的所有参数名称/值。我以前用INI文件做的只是指定部分名称以及参数名称,如下所示:

  #!/usr/bin/perl -w

  use strict;
  use warnings;
  use Config::Tiny;

  # Read the configuration file
  my $Config = Config::Tiny->new();
  $Config = Config::Tiny->read( 'configfile.ini' );
  my $Metric1_var = $Config->{switch_6500}->{cpu};
  my $Metric2_var = $Config->{switch_6500}->{free_memory};

然而,既然我有无限量的节名/参数,以及不知道他们的名字,我似乎无法找到提取所有值的方法。我正在环顾Config :: IniFiles模块,它有一些有趣的东西,但我似乎找不到一种方法来获取参数值而不知道节/参数名称。

如果有人可以帮助我迭代这个INI文件,我们将不胜感激。

谢谢。

3 个答案:

答案 0 :(得分:6)

您可以使用Config::Tiny执行所需操作。只需使用keys函数迭代哈希的所有键,如下所示:

use strict;
use Config::Tiny;

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

foreach my $section (keys %{$config}) {
    print "[$section]\n";
    foreach my $parameter (keys %{$config->{$section}}) {
        print "\t$parameter = $config->{$section}->{$parameter}\n";
    }
}

注意:因为哈希是“散列”的,并且没有像数组那样排序,所返回的键的顺序可能看起来没有意义。由于顺序在INI文件中无关紧要(只有哪个参数位于哪个部分很重要),这应该不是问题。

答案 1 :(得分:5)

我个人更喜欢Config::Simple。您可以调用它的param()方法,不带任何参数来返回文件中的所有参数。它还有一些比Config::Tiny更好的功能。

答案 2 :(得分:2)

我知道你对解析ini文件很满意。 如果您只想循环遍历所有部分&他们的密钥对

你可以像这样循环Hash-Of-Hash。

foreach my $Section (keys %$Config) {
 print "[$Section]";
 foreach my $Key (keys %{$Config->{$Section}}) {
  print "$Key = $Config->{$Section}->{$Key}";
 }
}