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 = ) { 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)