15

PerlでINIファイルを解析してハッシュに変換する最良の方法は何ですか?

4

7 に答える 7

22

Config::IniFilesモジュールを使用することを好みます。

于 2010-01-06T18:01:28.983 に答える
9

もっと魅力的なスタイルが好きなら、試してみてくださいTie::Cfg。サンプル:

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

$conf{test}="this is a test";
于 2010-01-06T17:32:10.440 に答える
9

最善の方法は、他の人が提案しているように、CPANで利用可能なモジュールを利用することです。以下はあなた自身の理解のためだけのものです、あなたがこのようなiniファイルを持っているとしましょう:

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

Perlの正規表現(または文字列メソッド)とハッシュなどのデータ構造を使用するだけで、モジュールなしで独自の解析を行うことができます。

サンプルコード:

   $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
于 2010-01-07T06:12:49.627 に答える
8

Config :: Tinyは非常に簡単で、簡単に使用できます。

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

my $one = $Config->{section}->{one};
my $Foo = $Config->{section}->{Foo};
于 2010-01-06T17:33:05.860 に答える
7

CPANからこのモジュールを試してください:Config :: INI :: Reader

于 2010-01-06T17:29:27.670 に答える
2

上記のニッチピッキング:

CPANからダウンロードされたTie::Cfgは、スペースが含まれている可能性のあるセクションとキーを処理しません。セクションとセクション内のキーの両方のハッシュエントリを設定するときに、「キー」の前後に引用符( ")を追加して変更する必要があります。私が読み取ろうとしているファイルは、MS Windowsの人々によって生成されたものであるため、周りを回るのに十分なスペースがあります。

Config :: Tiny、Config::IniFilesはフォーマットに煩わしいです。いずれかの行が[section]またはkey=valの形式でない場合、エラーがスローされ、ハッシュに到達できません。少なくともConfig :: Filesでは、とにかく適切に入力されます。エラーを無視するオプションがあると便利です。私が読み込もうとしているファイルには、m4を実行して取り除くことができる、いくつかの偽のM4行が含まれていますが、この特定のスクリプトで実行しようとしていることでは、これは必要ありません。

于 2013-04-12T16:25:39.817 に答える
2

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);
于 2014-10-17T06:27:53.240 に答える