Hallo Leute,
hab ein kleines Problem mit meinem Regulären Ausdruck.
Ich Lese eine Datei Zeilenweise aus und möchte in jeder Zeile eine aufteilung erzielen.
Meine Datei sieht wie folgt aus:
Mein bisher nicht gelungenes Perl Script ;o)
WIe man vieleicht sehen kann handelt es sich um Assembler Code.
Ich muss alles was hinter # steht verwerfen.
Dann muss ich die vergebenen Namen(loop,done,zero) ein eine variable speichern. Die Befehle (get put ld st add sub jpos jz j halt const) auch einzeln speichern.
Also sollte bei der Zeile:
das rauskommen
$1='' $2=st $3=sum
Bei Zeile:
das
$1=loop $2=get $3=''
uns so weiter
die Zwischenräume können leezeichen und Tabulatoren sein. Aber das kann man ja einfach mit '\t ' abfangen.
Ich weiss auch nicht ob das mit Regulären ausdrücken lösen kann. Evtl reicht einfach ein split.
Ich habe verschiedene Lösungsansätze versucht doch leider kam bei mir immer nicht gutes bei raus (
hab ein kleines Problem mit meinem Regulären Ausdruck.
Ich Lese eine Datei Zeilenweise aus und möchte in jeder Zeile eine aufteilung erzielen.
Meine Datei sieht wie folgt aus:
Code:
#
# print sum of input numbers
#
ld zero # initialize sum to zero
st sum
loop get # read a number
jz done # no more input if number is zero
add sum # add in accumulated sum
st sum # store new value back in sum
j loop # go back and read another number
done ld sum
put # print sum
halt # stop program execution
zero const 0 # constant
sum const # variable
Mein bisher nicht gelungenes Perl Script ;o)
Code:
use strict;
use warnings;
use Data::Dumper;
use Storable qw(store retrieve freeze thaw dclone);
#-----------------------------------------------------------------------------------
#Globale Variablen
#-----------------------------------------------------------------------------------
my $INFILE = 'sum.asm';
my $adresse = 0;
my %symboltabelle;
my @befehle = qw(get put ld st add sub jpos jz j halt const);
my $regex = qr/\t ([A-Z][a-z]) \t/;
my $counter = 0;
open (IN,"<$INFILE") || die "$0:failed to open input file $INFILE:$!\n";
while (<IN>){
#foreach (split(/ \t\n/,$_))
#{
# if(exists(${befehle}{$_})){
# $symboltabelle{$_} = $counter;
# }
# print $_,"\n";
#}
if( $_ =~ m/$regex/ ) {
print "$1 $2 $3 \n";
}
else{
print "in Zeile ",$counter," keine Syntax entdeckt\n";
}
$counter++;
}
close(IN);
#print Dumper %symboltabelle ;
WIe man vieleicht sehen kann handelt es sich um Assembler Code.
Ich muss alles was hinter # steht verwerfen.
Dann muss ich die vergebenen Namen(loop,done,zero) ein eine variable speichern. Die Befehle (get put ld st add sub jpos jz j halt const) auch einzeln speichern.
Also sollte bei der Zeile:
Code:
st sum
$1='' $2=st $3=sum
Bei Zeile:
Code:
loop get # read a number
$1=loop $2=get $3=''
uns so weiter
die Zwischenräume können leezeichen und Tabulatoren sein. Aber das kann man ja einfach mit '\t ' abfangen.
Ich weiss auch nicht ob das mit Regulären ausdrücken lösen kann. Evtl reicht einfach ein split.
Ich habe verschiedene Lösungsansätze versucht doch leider kam bei mir immer nicht gutes bei raus (