如何从Perl访问INI文件?

时间:2010-01-06 17:28:22

标签: perl config ini

在Perl中解析INI文件并将其转换为哈希的最佳方法是什么?

7 个答案:

答案 0 :(得分:22)

我更喜欢使用Config::IniFiles模块。

答案 1 :(得分:9)

如果您喜欢更多的风格,请尝试Tie::Cfg。样品:

tie my %conf, 'Tie::Cfg', READ => "/etc/connect.cfg";

$conf{test}="this is a test";

答案 2 :(得分:9)

最好的方法是使用CPAN中的可用模块,就像其他人建议的那样。以下只是为了您自己的理解,假设您有这样的ini文件:

$ more test.ini
[Section1]
    s1tag1=s1value1             # some comments
[Section2]
    s2tag1=s2value1           # some comments
    s2tag2=s2value2
[Section3]
    s3tag1=s3value1

你可以使用Perl的正则表达式(或字符串方法)+哈希等数据结构来自己解析w / o模块。

示例代码:

   $ini="test.ini";
    open (INI, "$ini") || die "Can't open $ini: $!\n";
        while (<INI>) {
            chomp;
            if (/^\s*\[(\w+)\].*/) {
                $section = $1;
            }
            if (/^\W*(\w+)=?(\w+)\W*(#.*)?$/) {
                $keyword = $1;
                $value = $2 ;
                # put them into hash
                $hash{$section} = [ $keyword, $value];
            }
        }
    close (INI);
    while( my( $k, $v ) = each( %hash ) ) {
        print "$k => " . $hash{$k}->[0]."\n";
        print "$k => " . $hash{$k}->[1]."\n";
    }

输出

$ perl perl.pl
Section1 => s1tag1
Section1 => s1value1
Section3 => s3tag1
Section3 => s3value1
Section2 => s2tag2
Section2 => s2value2

答案 3 :(得分:8)

Config::Tiny非常简单易用。

$Config = Config::Tiny->read( 'file.conf' );

my $one = $Config->{section}->{one};
my $Foo = $Config->{section}->{Foo};

答案 4 :(得分:7)

从CPAN尝试此模块:Config::INI::Reader

答案 5 :(得分:1)

挑选上述内容:

从CPAN下载的

Tie :: Cfg不处理可能包含空格的部分和键。当设置部分和部分内的键的哈希条目时,需要通过在“键”周围添加引号(“)来更改它。我正在尝试读取的文件是由MS Windows的人员生成的,因此有足够的空间去处理。

Config :: Tiny,Config :: IniFiles对格式很挑剔。如果任何行不是[section]或key = val的形式,它们会抛出一个错误,并且无法进入散列,至少在Config :: Files中,无论如何都要正确填充。有一个忽略错误选项会很高兴。我正在尝试阅读的文件中有一些虚假的M4行,我可以通过m4来删除,但这对于我正在尝试使用这个特定的脚本来说并不是必需的。

答案 6 :(得分:1)

ini文件编辑的读写功能:

sub iniRead
 { 
  my $ini = $_[0];
  my $conf;
  open (INI, "$ini") || die "Can't open $ini: $!\n";
    while (<INI>) {
        chomp;
        if (/^\s*\[\s*(.+?)\s*\]\s*$/) {
            $section = $1;
        }

        if ( /^\s*([^=]+?)\s*=\s*(.*?)\s*$/ ) {
          $conf->{$section}->{$1} = $2;         
        }
    }
  close (INI);
  return $conf;
}
sub iniWrite
{
  my $ini = $_[0];
  my $conf = $_[1];
  my $contents = '';
foreach my $section ( sort { (($b eq '_') <=> ($a eq '_')) || ($a cmp $b) } keys %$conf ) {
    my $block = $conf->{$section};
    $contents .= "\n" if length $contents;
    $contents .= "[$section]\n" unless $section eq '_';
    foreach my $property ( sort keys %$block ) {
      $contents .= "$property=$block->{$property}\n";
    }
  }
  open( CONF,"> $ini" ) or print("not open the file");
  print CONF $contents;
  close CONF;
}

样本用法:

读取conf文件并保存到哈希

$conf = iniRead("/etc/samba/smb.conf");

更改您的配置属性或添加新的配置属性

修改

$conf->{"global"}->{"workgroup"} = "WORKGROUP";

添加了新配置

$conf->{"www"}->{"path"}="/var/www/html";

将新配置保存到文件

iniWrite("/etc/samba/smb.conf",$conf);