Thread If Befehle in Textdatei
(13 answers)
Opened by KevinHuhm at 2011-09-29 20:13
Hier eine Minilösung, die immerhin für dein Beispiel ausreicht. Vielleicht kannst du sie als Ausgangspunkt gebrauchen.
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 use strict; use warnings; use feature "switch"; use 5.10.1; # for say my %vars; { # main while (my $cmd = <DATA>) { chomp $cmd; given ($cmd) { # Zuweisung when (/^(\w)=(\d+)$/) {$vars{$1} = $2; say $_} when (/^IF /) { my $beding = substr($_, 3); my $beding_perl; if (/OR/) { $beding_perl = bedingung($beding); } else { $beding_perl = vergleich($beding); } if (! eval $beding_perl) { # if-Block skippen until (<DATA> eq "ENDIF\n") {} } } when (/^ENDIF$/) {} # übrige Kommandos durchwinken default {say $cmd}; } } } sub bedingung { my $bed = shift; my ($vgl_l, $vgl_r) = $bed =~ /(.+?) OR (.+)/ or die "ungültige Bedingung $bed"; my $bed_perl = vergleich($vgl_l) . ' || ' . vergleich($vgl_r); return $bed_perl; } sub vergleich { my $vgl = shift; $vgl =~ tr/()//d; $vgl =~ s/^([a-z])/$vars{$1}/e or die "ungültiger Vergleich $_[0]"; return $vgl; } __DATA__ a=1 b=4 c=4 IF (b<3) OR (c>2) a=0 ENDIF IF (b>3) a=2 ENDIF Du wirst bemerken, dass ich die IF- und ENDIF-Zeilen nicht mit ausgebe. Da eh klar ist, dass die Bedingung wahr ist, kann man sich das wohl sparen. Sonst müsstest du noch 2 Ausgaben einfügen. In der geposteten Ausgabe fehlt IMHO die Zeile Code (perl): (dl
)
a=0 da die Bedingung (c>2)erfüllt ist. Gruß GUIfreund Gruß
GUIfreund |