Thread If Befehle in Textdatei (13 answers)
Opened by KevinHuhm at 2011-09-29 20:13

GUIfreund
 2011-10-01 13:54
#152817 #152817
User since
2011-08-08
559 Artikel
BenutzerIn
[default_avatar]
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

View full thread If Befehle in Textdatei