#!/usr/local/bin/perl -w
my
$grammar
=
q(
{
sub consolidate {
my $aref = shift;
my @a = @{$aref};
my %new = ()
;
foreach
my
$a
(
@a
) {
my
%h
= %{
$a
};
foreach
my
$k
(
keys
%h
) {
if
(
ref
(
$h
{
$k
})) {
foreach
my
$k2
(
keys
%{
$h
{
$k
}}) {
$new
{
$k
}->{
$k2
} =
$h
{
$k
}->{
$k2
};
}
}
else
{
$new
{
$k
} =
$h
{
$k
};
}
}
}
return
\
%new
;
}
}
file: section(s)
{
$return
= consolidate(
$item
[1]) }
section: header
'{'
body
'}'
{
$return
= {
$item
[1] =>
$item
[3] } }
header:
'Domain='
/.+/
{
$return
=
$item
[2] }
body: line(s)
{
$return
= consolidate(
$item
[1]) }
line: lineA | lineB
{
$return
=
$item
[1] }
lineA: /[^\W_]+/
'='
/.+/
{
$return
= {
$item
[1] =>
$item
[3] } }
lineB: /[^\W_]+/
'_'
/[^\W_]+/
'='
/.+/
{
$return
= {
$item
[1] => {
$item
[3] =>
$item
[5] } } }
);
my
$parser
= Parse::RecDescent->new(
$grammar
);
my
$text
;
my
@text
= <DATA>;
foreach
(
@text
)
{
next
if
/^\
$text
.=
$_
;
}
my
$f
=
$parser
->file(
$text
);
print
Dumper (
$f
);