Thread Parameter umwandeln
(55 answers)
Opened by Benji2010 at 2010-12-13 12:04
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; } |