Hi,

I'm getting this error:

 3|assignment|>>Matched repeated subrule: [value]<< |
  |          |(1 times)                             |
 3|assignment|Trying action                         |
Can't use an undefined value as an ARRAY reference at (eval 12) line 299, <DATA> line 
4.

when trying to run this simple script:


#!/usr/bin/perl -w

use strict;
use vars qw($parser $text %hol);
use Data::Dumper;
use Parse::RecDescent;
$RD_HINT = 1;
$RD_TRACE = 1;
$parser = Parse::RecDescent->new(q(

mmpfile: chunk(s) /^\Z/
chunk: assignment | <error>
assignment: keyword <skip: '[ \t]*'> value(s) {
        # add 1 or more values to the hash of lists
        push @{$::hol{uc $item{keyword}}}, @{$item{value}};
}
keyword: /key\d+/
value: /val\d+/

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

__DATA__
key1            val1
key2            val2 val3


on my OpenBSD-current PC with perl 5.8.3.
After reading the article about autovivification
http://tlc.perlarchive.com/articles/perl/ug0002.shtml
I've even tried this code to create a [] if needed:

assignment: keyword <skip: '[ \t]*'> value(s) {
        # add 1 or more values to the hash of lists
        push @{$::hol{uc $item{keyword}} ||= []}, @{$item{value}};
}

But the error stayed same. So I've decided that 
it's not the first push() argument, but the second.
And the following code seems to work now:

assignment: keyword <skip: '[ \t]*'> value(s) {
        push @{$::hol{uc $item{keyword}}}, 
            ref $item{value} ? @{$item{value}} : $item{value};
}

However I don't see similar code in the demo/demo_*.pl
examples of R::PD... Also, I don't get the error on my 
RedHat 9 PC at work with perl 5.8.0, but still get it
when using 5.8.2 on the same PC. That's confusing...

Regards
Alex

Reply via email to