Guest KevinHuhmDanke für den Edit, aber es ist kein Code sondern ein Auszug aus einer Textdatei....
Guest KevinHuhmDanke für den Edit, aber es ist kein Code sondern ein Auszug aus einer Textdatei....
Wie gesagt ist ein Auszug aus einer Textdatei, hat nix mit einer Programmiersprache zu tun. Um genau zu sein, soll es für eine Maschinensteuerung sein.
modedit Editiert von pq: code-tags statt quote-tags
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
a=0