Parse::RecDescent, Erreichbarkeit von Variablen

05/01/2010 - 12:46 von Martin Bley | Report spam
Hallo NG,

folgendes Problem:

Ich habe ein Package mit dem Namen DhcpParser. In diesem Package gibt
es eine Methode parseFile. Innerhalb der Grammatik möchte ich nun die
geparsten Werte in einen Array schreiben und aus der Methode via
return
Anweisung zurückgeben. Leider habe ich außerhalb der Grammatik keinen
Zugriff auf die Variablen (namentlich @hosts).

In der Doku steht, dass die Variablen im Kontext von Parse::RecDescent
zu sehen sind, wie kann ich aber darauf aus der Methode parseFile()
zugreifen?
Da steh ich wirklich auf dem Schlauch. Weiss jemand Rat?

Ich habe auch schon versucht, die Variable @hosts mit our ganz oben im
package zu deklarieren, leider auch ohne Erfolg. Hier meine package
(gekürzt)

package DhcpParser;
[...]
use Parse::RecDescent;
[...]
sub new {
[...]

}

sub parseFile {
my $self = shift;

my %tmp = ();
my @hosts;

my $grammar = <<'EOGRAMMAR';
IDHOST : /[a-zA-Z-0-9]+/
IDMAC : /[a-fA-F0-9:]+/
IDIP : /[0-9.]+/
IDCOMMENT : /.*/

file : host(s?)

host : /^host/ IDHOST
{
$::tmp{'name'} = $item[2];
}

/{/ comment(?) option(s?) terminator(1)

comment : <skip: qr/[ \t]*/> word(s?) newline
word : /#/ IDCOMMENT
{
$::tmp{'comment'} = $item[2];
}

newline : //

option : mac | ip | other

mac : /hardware ethernet/ IDMAC /;/
{
$::tmp{'mac'} = $item[2];

}

ip : /fixed-address/ IDIP /;/
{
$::tmp{'ip'} = $item[2];

}

other : /[^}]/

terminator : /}/
{
push(@::hosts, {
'name' => $::tmp{'name'},
'comment' => $::tmp{'comment'},
'mac' => $::tmp{'mac'},
'ip' => $::tmp{'ip'} }
);
%::tmp = ();
}

EOGRAMMAR

my $parse = new Parse::RecDescent($grammar);

# Datei einlesen
my $text;
open( IN, "<" . $self->{FILENAME} ) or die "Fehler: parseFile:
($!)";
while (<IN>) {
next if ( $_ =~ /^#/ || $_ =~ /^\s+$/ );
$text .= $_;
}
close(IN);

my $tree = $parse->file($text);

if (not $tree) {
exit 1;
} else {
my $cnt= (@hosts); # <-- @hosts ist hier leer (im
Kontext der
# Grammatik
allerdings nicht)
print $cnt, "";
}

[...]
}

[...]
1;

Danke und Gruß,
Martin
 

Lesen sie die antworten

#1 Frank Seitz
05/01/2010 - 13:30 | Warnen spam
Martin Bley wrote:

In der Doku steht, dass die Variablen im Kontext von Parse::RecDescent
zu sehen sind, wie kann ich aber darauf aus der Methode parseFile()
zugreifen?
Da steh ich wirklich auf dem Schlauch. Weiss jemand Rat?



Sieht so aus, als würde das Array im Namespace main liegen.
Du musst also per @main::hosts oder @::hosts darauf zugreifen,
so wie es auch in den Parsermethoden gemacht wird.

Grüße
Frank
Dipl.-Inform. Frank Seitz
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Homepage: http://www.frank-seitz.de/
XING-Profil: http://www.xing.com/profile/Frank_Seitz2

Ähnliche fragen