use strict; use warnings; use feature "switch"; use 5.10.1; # for say my %vars; { # main while (my $cmd = ) { 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 ( 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