Hi,

I have a text consisting of keyword/value assignments, 
placed on 1 line (please see the __DATA__ on the bottom).
Some of the assignments are surrounded by START/END:

START WINS
key1    val1 val2
END

START MARM
key1    val1
END

I would like to capture all of the assignments into hashes
of lists. The top-level assignments should go into %hol,
and the START/END-surrounded assignments should go into
%wins and %marm. I'm trying to achieve this by passing the
platform name (the word following START) as an argument to
the assignment rule and by using that name (lowercased) as 
a symbolic reference.

Unfortunately my script listed below dies with the error:

Can't use string ("::hol") as a HASH ref while "strict refs" 
in use at (eval 18) line 303, <DATA> line 6.

Why does it mention "strict refs"? I'm explicitly setting
"no strict 'refs'" on the top of my script.

Also, I wonder if there is a nicer way to solve my problem.

The START/END areas do not nest, they are all 1-level deep.

Thank you
Alex

use strict;
no strict 'refs';
use vars qw($parser $text %hol %wins %marm);
use Data::Dumper;
use Parse::RecDescent;
$RD_WARN  = 1;
$RD_HINT  = 1;
$RD_TRACE = 120;
$parser = Parse::RecDescent->new(q(

mmpfile: chunk(s) /^\Z/
chunk: assignment[$arg[0]] | local | <error>
assignment: keyword <skip: '[ \t]+'> value(s) {
        my $hname = lc $arg[0] || 'hol';
        push @{${"::$hname"}{uc $item{keyword}}}, @{$item[3]};
}

local: /start/i <skip: '[ \t]+'> platform
                <skip: $item[2]> chunk[$item[3]](s?)
       /end/i { print "ITEM3: $item[3]\n" }

value: /val\d+/i
keyword: /key\d+/i
platform: /wins/i || /marm/i

)) or die 'Bad grammar';
$text .= $_ while (<DATA>);
defined $parser->mmpfile($text) or die 'bad text';
print Data::Dumper->Dump([\%hol,
                          \%wins,
                          \%marm],
                          [qw(hol wins marm)]);
__DATA__

key1            val1
START WINS
key2            val2 val3
END

Reply via email to