3

次のファイル構造を持っています -データセクションを参照してください:

#!/usr/bin/perl  
use strict;
use warnings;
use Text::Balanced qw(extract_bracketed);

my($ALL, $name, $pairs);
while(defined($name = <DATA>) && defined($pairs = <DATA>)) {
    $ALL->{$name} = parse_pairs($pairs);
}

sub parse_pairs {
    my $str = shift;

    my($extracted, $remainder) = extract_bracketed($str,'{}'); # how to?


}    
__DATA__
name1
key1 val1 key2 {val2a val2b} key3 val3
name2
key2 val2 key3 val3
name3
key1 {val1a val1b val1c} key2 {val2a val2b}

たとえば、すべての奇数行には一意の「名前」が含まれ、すべての偶数行にはスペースで区切られた複数の「キーと値」のペアが含まれます。

  • キーは常に 1 つの単語 (\w+)
  • 値は次のとおりです。
    • 1 つの文字列 (\S+)、または
    • ブラケット { } で囲まれた、スペースで区切られた複数の文字列

上記のファイルを perl 構造にする必要があります。

$ALL => {
    name1 => {
        key1 => ["val1"],
        key2 => ["val2a", "val2b"],
        key3 => ["val3"]
    },
[.......]

また

$ALL => {
    name1 => {
        key1 => {
           val1 => undef,
        },
        key2 => {
           val2a => undef,
           val2b => undef,
        }
        key3 => {
           val3 => undef,
        }
    },
[.......]

これはおそらくText::Ballanced の仕事ですが、使用方法がわかりません。ここには混合値があり、単純な単語だけのものもあれば、バランスが取れているものもあります - 括弧で囲まれており、抽出を繰り返す方法がわからない. ;(

parse_pairs上記のsrcにサブを記述する方法について、いくつかのヒントが必要です。

4

1 に答える 1

2

これが私が持っているものです。ただし、Text::Balanced は使用していません。Regexp::Common を使用しています:

#!/usr/bin/perl  
use strict;
use warnings;
use Regexp::Common;

my($ALL, $name, $pairs);
while(defined($name = <DATA>) && defined($pairs = <DATA>)) {
    chomp $name;
    chomp $pairs;
    $ALL->{$name} = parse_pairs($pairs);
}
use Data::Dump; dd $ALL;

sub parse_pairs {
    my $str = shift;

    my @key_values = $str =~ /
        (\w+)    # key
        \s*
        (\w+|$RE{balanced}{-parens=>'{}'}) # value
        \s*/xg;

    my $r;
    while (@key_values)
    {
        $key_values[1] =~ s/^\{//;
        $key_values[1] =~ s/\}$//;
        $r->{$key_values[0]} = [ split /\s+/, $key_values[1] ];
        splice @key_values, 0, 2;
    }
    $r;
}
__DATA__
name1
key1 val1 key2 {val2a val2b} key3 val3
name2
key2 val2 key3 val3
name3
key1 {val1a val1b val1c} key2 {val2a val2b}

これにより、探している出力が生成されるようです (オプション 1)。

于 2012-06-27T22:30:58.197 に答える