Thread Parameter umwandeln (55 answers)
Opened by Benji2010 at 2010-12-13 12:04

topeg
 2011-11-23 12:33
#154434 #154434
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Allmählich kommt man an die Grenzen dieses Codes. Wenn es noch komplexer wird, ist es einfacher einen Besseren Parser/Interpreter zu schreiben.

# ungetestet:
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
#!/usr/bin/perl -p

use strict;
use warnings;
use vars qw(%var);

while ( /([A-Z][0-9]*)=(\S+)|T\d{3,4}(\d\d)\d\D|([A-Z][0-9]*\()([^\)]+\))/g ) {
    my( $id, $val, $t_expr, $kstart, $kbody, $pos ) = ( $1, $2, $3, $4, $5, pos );

    if ( defined $t_expr ) {
        $var{'R10'} = $t_expr;
        next;
    }

    if( defined $kstart )
    {
      my $len=length($kstart.$kbody);

      # ')' am ende entfernen
      # $kbody an "," splitten
      # elemente bearbeiten
      # alles wieder zusammenfügen
      $kbody=~s/)$//;
      my @elements=split(/,/,$kbody);
      for my $elm (@elements);
      {
        $elm=~s/([A-Z][0-9]*)/$var{$1}||''/ge;
        if ( $elm =~ /^[\d\*\/\+\-\(\).]+$/ )
        { $elm = eval $elm; }
      }
      $kbody=join(',',@elements).")";
      
      substr $_, $pos - $len, $len, $kstart.$kbody;
      pos = $pos - $len + length $kstart.$kbody;
      next;
    }

    if ( substr($_,0,1) eq '(' ) {
    next;
    }

    my $len = length $val;

    
    (my $tmp_val = $val) =~ s/([A-Z][0-9]*)/$var{$1}||''/ge;
    
    if ( $tmp_val =~ /^[\d\*\/\+\-\(\).]+$/ ) {
        $tmp_val = eval $tmp_val;
        $var{$id} = $val = $tmp_val unless $@;
    }
    
    substr $_, $pos - $len, $len, $val;
    pos = $pos - $len + length $val;
}

View full thread Parameter umwandeln