Thread Parameter umwandeln
(55 answers)
Opened by Benji2010 at 2010-12-13 12:04
Es hat mich gereizt, mich ebenfalls an dem Problem zu versuchen. Allerdings stammt der Hauptteil der Diskussion aus einer Zeit, als ich noch nicht hier im Forum war. Da hatte ich einiges nachzuarbeiten.
Ich habe mich bemüht, meine Regexe möglichst einfach zu halten. Je komplexer eine Regex ist, desto größer ist die Gefahr von falsch positiven oder falsch negativen Treffern. Als Dreingabe habe ich noch den Sinus eingebaut. Und Exponenten bei Gleitkommawerten (habe ich gebraucht für SIN(180)). Hier mein Resultat: 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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 use strict; use warnings; use feature "switch"; use 5.10.1; # for say use constant PI => 4*atan2(1, 1); use constant DEG2RAD => 2*PI/360; my %vars; $vars{R10} = ''; { # main while (my $line = <DATA>) { chomp $line; my @cmds = split(' ', $line); foreach my $cmd (@cmds) { given ($cmd) { # Zuweisung when (/^(\w+)=(.+)$/) {$vars{$1} = ausdruck($2); $cmd = "$1=$vars{$1}"; next} # Kommentare durchwinken when (substr($_, 0, 1) eq '(') {next} # Sonderfall R10 when (substr($_, 0, 1) eq 'T') {$vars{R10} = substr($_, -3, 2); next} # Argumente when (/^(\w+)\((.+)\)$/) { my $funktion = $1; my @params = split(',', $2); my @ersetzte; foreach my $par (@params) { push @ersetzte, ausdruck($par); } $cmd = "$funktion(" . join(',', @ersetzte) . ')'; next; } default {say "Unbekanntes Kommando $cmd"}; } } say join ' ', @cmds; } } sub ausdruck { my $ausdr = shift; foreach my $var (keys %vars) { $ausdr =~ s/\b$var\b/$vars{$var}/g; } # entferne Klammern $ausdr =~ m'\(' and $ausdr = klammern($ausdr); # berechne Sinus $ausdr =~ s/SIN(-?[\d.]+)/sin($1*DEG2RAD)/eg; # replace exponent $ausdr =~ s/([.\d])e(-?\d+)/$1*10**$2/g; $ausdr =~ m'^[-+*/\d.]+$' and $ausdr = eval $ausdr; return $ausdr; } sub klammern { my $ausdr = shift; while ($ausdr =~ s'\(([^(]*?)\)'ausdruck($1)'e) {}; return $ausdr; } __DATA__ R53=30 X=SIN(R53)+R53 R79=55 M977(103,R79,20,300) T7020320 X=R10 R1=15 R4=20 X=R1+R4 Y=R1*R4 M779(R4,R1,20) M13(R1+R4,10,R4-R1) Editiert von GUIfreund: More-Tag eingefügt. Last edited: 2011-11-25 17:50:41 +0100 (CET) Gruß
GUIfreund |