如何从Perl访问INI文件?

如何从Perl访问INI文件?,perl,config,ini,Perl,Config,Ini,用Perl解析INI文件并将其转换为哈希的最佳方法是什么?从CPAN尝试此模块:如果您喜欢更高级的样式,请尝试。样本: 使用起来非常简单和直接 $Config = Config::Tiny->read( 'file.conf' ); my $one = $Config->{section}->{one}; my $Foo = $Config->{section}->{Foo}; 我更喜欢使用模块。最好的方法是按照其他人的建议使用CPAN中可用的模块。以下仅为您自

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

从CPAN尝试此模块:

如果您喜欢更高级的样式,请尝试。样本:

使用起来非常简单和直接

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

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

我更喜欢使用模块。

最好的方法是按照其他人的建议使用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";
    }

对上述问题吹毛求疵:

从CPAN下载的Tie::Cfg不处理可能包含空格的节和键。在设置节和节中的键的哈希项时,需要通过在“键”周围添加引号(“)来更改。我试图读取的文件是由MS Windows的人员生成的,因此有足够的空间


Config::Tiny,Config::ini文件对格式很挑剔。如果任何一行不是[section]格式或者key=val,它们会抛出一个错误,人们无法访问哈希值,至少在Config::Files中,哈希值是正确填充的。如果有一个ignore error选项,那就太好了。我试图读取的文件中有一些虚假的M4行,我可以通过M4来消除,但这在我试图处理这些文件时是不必要的特定脚本。

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->{"www"}->{"path"}="/var/www/html";
已将新配置保存到文件

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

Config::IniFiles是一个非常强大的INI管理器。很好的建议。最好的方法是查看CPAN().:)请注意,此解析器将为每个部分只保留一个键/值对。Perl最佳实践建议不要使用正则表达式读取配置文件,而是使用CPAN中的标准模块…用于ini文件:
config::IniFiles
。为什么要重新发明轮子?可能是开发人员无法安装包,或者无法配置或使用另一个包,或者en将函数用于工作。建议“Perl最佳实践”不要使用tie。
$conf = iniRead("/etc/samba/smb.conf");
$conf->{"global"}->{"workgroup"} = "WORKGROUP";
$conf->{"www"}->{"path"}="/var/www/html";
iniWrite("/etc/samba/smb.conf",$conf);