Leser: 46
QuoteN3070 MSG ( "TEST")
N3080 G95 S100 M3 f0.2
N3090 G0 Z200
N3100 X=0 Y=-630 C=DC(0)
N3110 M8
N3120 R12=30
N3121 R14=40
N3122 X=R12+R14
QuoteN3070 MSG ( "TEST")
N3080 G95 S100 M3 f0.2
N3090 G0 Z200
N3100 X=0 Y=-630 C=DC(0)
N3110 M8
N3120 R12=30
N3121 R14=40
N3122 X=70
QuoteN490 R53=800 R52=50
N500 X=R53 Y=-R52-40
QuoteN610 R24=R23/(R53*2)
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
#!/usr/bin/perl use strict; use warnings; my %vars; while(my $line=<DATA>) { # Zeile berechnen wenn Rexexp matched my @calc; $line=~s/(\w+)=(\S+)/push(@calc,[$1,$2]); $_="##$#calc##"/eg; # etwas gefunden if(@calc) { for(0..$#calc) { my $k=$calc[$_][0]; my $v=$calc[$_][1]; # es ist ein Berechnung if($v=~/^(?:R|-|\+|\d)/) { # variablen durch konstante ersetzen $v=~s/(R\d+)/$vars{$1}/g; # berechnen $v=eval($v); } # variablenzuweisung $vars{$1}=$v if($k=~/(R\d+)/); # Ersetzung Rückgängig machen $line=~s/##$_##/$k=$v/g; } } # Zeile Ausgeben print $line; } __DATA__ N3070 MSG ( "TEST") N3080 G95 S100 M3 f0.2 N3090 G0 Z200 N3100 X=0 Y=-630 C=DC(0) N3110 M8 N3120 R12=30 N3121 R14=40 N3122 X=R12+R14 N490 R53=800 R52=50 N500 X=R53 Y=-R52-40 N609 R23=100 R53=10 N610 R24=R23/(R53*2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#!/usr/bin/perl -p use strict; use warnings; use vars qw(%var); while ( /([A-Z][0-9]*)=(\S+)/g ) { my( $id, $val, $pos ) = ( $1, $2, pos ); 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; }
1
2
3
$ perl script.pl input.txt > output.txt
oder:
$ perl script.pl < input.txt > output.txt
QuoteX=-R30-R50-R60
QuoteN10 R60=125/2
N15 R50=20
N16 R30=390/2
N18 X=-R30-R50-R60 Y0
N21 G1 G41 X=-R30-R50 Y0
N22 G3 X=R30+R50 Y0 I=R30+R50 J0
N24 G40 X=-R30-R50-R60 Y0
QuoteR60=62.5
N15 R50=20
N16 R30=195
N18 X=-R30-R50-R60 Y0
N21 G1 G41 X=-215 Y0
N22 G3 X=215 Y0 I=215 J0
N24 G40 X=-R30-R50-R60 Y0
Guest benji2010Das hat mit der Anzahl der Parameter nix zu tun.Input:
QuoteN10 R60=125/2
N15 R50=20
N16 R30=390/2
N18 X=-R30-R50-R60 Y0
N21 G1 G41 X=-R30-R50 Y0
N22 G3 X=R30+R50 Y0 I=R30+R50 J0N24 G40 X=-R30-R50-R60 Y0
ab 3 Parametern macht er keine Berechnung mehr..Kann den Fehler leider nicht erkennen.
if ( $tmp_val =~ m:^[0-9.()*/+-]+$: ) {
if ( $tmp_val =~ m:^[0-9.()*/+-]+$/: ) {
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
#!/usr/bin/perl
use strict;
use warnings;
my %vars;
while(my $line=<DATA>)
{
# Zeile berechnen wenn Rexexp matched
my @calc;
$line=~s/(\w+)=(\S+)/push(@calc,[$1,$2]); $_="##$#calc##"/eg;
# etwas gefunden
if(@calc)
{
for(0..$#calc)
{
my $k=$calc[$_][0];
my $v=$calc[$_][1];
# es ist ein Berechnung
if($v=~/^(?:R|-|\+|\d)/)
{
# variablen durch konstante ersetzen
$v=~s/(R\d+)/$vars{$1}/g;
# berechnen
$v=eval($v);
}
# variablenzuweisung
$vars{$1}=$v if($k=~/(R\d+)/);
# Ersetzung Rückgängig machen
$line=~s/##$_##/$k=$v/g;
}
}
# Zeile Ausgeben
print $line;
}
__DATA__
N3070 MSG ( "TEST")
N3080 G95 S100 M3 f0.2
N3090 G0 Z200
N3100 X=0 Y=-630 C=DC(0)
N3110 M8
N3120 R12=30
N3121 R14=40
N3122 X=R12+R14
N490 R53=800 R52=50
N500 X=R53 Y=-R52-40
N609 R23=100 R53=10
N610 R24=R23/(R53*2)
Guest benji2010Du hast Recht..Mit einem ganzzahligen Wert funktionierte der Quellcode.
Wenn ich jetzt allerdings diesen Code einfüge:
Code: (dl )if ( $tmp_val =~ m:^[0-9.()*/+-]+$/: ) {
lässt er die Parameter sowohl bei ganzzahligen, als auch bei Dezimalzahlen stehen...
Folgender Code hat ja bereits funktioniert: ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl -p
use strict;
use warnings;
use vars qw(%var);
while ( /([A-Z][0-9]*)=(\S+)/g ) {
my( $id, $val, $pos ) = ( $1, $2, pos );
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;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#!/usr/bin/perl -p use strict; use warnings; use vars qw(%var); while ( /([A-Z][0-9]*)=(\S+)/g ) { my( $id, $val, $pos ) = ( $1, $2, pos ); 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; }
Guest werWohl fälschlich als Spam erkannt.(Posting not accepted)
Keine Ahnung warum das nicht akzeptiert wird...