1

レコードを含む複数行の構成ファイルを perl ハッシュ配列に読み込もうとしています

構成ファイルの例:

    record_1
      phone=5551212
      data=1234234
    end_record_1

    record_2
      people_1=bob
      people_2=jim
      data=1234
    end_record_2

    record_3
     people_1=sue
    end_record_3

ここに私が探しているものがあります:

$myData{1}{"phone"}  <--- 5551212
$myData{1}{"data"}   <--- 1234234

$myData{2}{"people_1"} <--- bob
... etc

これは何と読むのがベストでしょうか?モジュール?複数行一致の正規表現? 強引な?次はどこに行こうか迷っています。

4

3 に答える 3

8

データセットのオプションの 1 つを次に示します。

use strict;
use warnings;
use Data::Dumper;

my %hash;
{
    local $/ = '';
    while (<DATA>) {
        my ($rec) = /record_(\d+)/;
        $hash{$rec}{$1} = $2 while /(\S+)=(.+)/g;
    }
}

print Dumper \%hash;

__DATA__
record_1
    phone=5551212
    data=1234234
end_record_1

record_2
    people_1=bob
    people_2=jim
    data=1234
end_record_2

record_3
    people_1=sue
end_record_3

出力:

$VAR1 = {
          '1' => {
                   'data' => '1234234',
                   'phone' => '5551212'
                 },
          '3' => {
                   'people_1' => 'sue'
                 },
          '2' => {
                   'people_1' => 'bob',
                   'data' => '1234',
                   'people_2' => 'jim'
                 }
        };

設定local $/ = ''すると、空の行がデータ セットの「レコード セパレータ」として扱われるため、これらのレコードで正規表現を使用して、ハッシュ キー/値の情報を取得できます。

お役に立てれば!

于 2012-11-05T02:47:03.807 に答える
1

これには多くのモジュールがあるため、(いつものように) 車輪を再発明するのではなく、それらを使用することをお勧めします。

Config::Simple投稿した構成ファイルのスニペットから、最良の選択のように見えます。構成フォーマットを単純化できれば、Config::Tiny使いやすくなります。より複雑な場合は、 を使用する必要があるかもしれませんConfig::General

http://metacpan.org/pod/Config::Tiny

http://metacpan.org/pod/Config::Simple

http://metacpan.org/pod/Config::General

于 2012-11-05T05:33:04.477 に答える
0

一度に 1 行ずつ読んでください。

新しいレコードが表示されたら、新しい空の連想配列を追加しmyDataて参照を取得します。これが「現在のレコード」になります。

行にキーと値のペアが表示されたら、それを現在のレコード配列に追加できます (存在する場合)。

レコードの終わりが見えたら、現在のレコードへの参照をクリアするだけです。

于 2012-11-05T02:44:54.427 に答える