hash (oder einfach mal kein dummes zeug reden)
roman lenz
- perl
0 fastix®0 Norbert Klein0 fastix®0 fastix®
0 roman lenz
hi hi
ich will aus einer Datei Blöcke auslesen und diese dann in einem hash speicher (hash mit anonymen hash).
der hash soll als key die Part Id und als wert eine referenz, auf eine hash erhalten. das ganze klappt hat :-) mit der einschränkung das der hash nur ein key-wert Paar hat (es müssten 12 sein). im hash ist immer nur die letzte zuweisung.
ich finde meine fehler nicht kann mirjemand weiter helfen??
bis bis roman
__code__
#!/usr/bin/perl -w
use strict;
my $such_zahl='([+-]?(?:\d+[.,]\d+|[.,]\d+|\d+)(?:[eE][+-]?\d+)?)'; # !!später ausbessern!!
my $n=-1;
my (%bom, $part, $part_id, $mat_typ, $dichte, $etyp, $contact_thickness, $thickness_sacle);
my $zeile;
open (DAT, "< demo.txt");
while(defined($zeile=<DAT>)){
if($zeile =~/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/){
$n=3;
undef($part_id);
}
$zeile=~/(\w+)/, $part=$1 if($n==0);
$zeile=~/$such_zahl/, $part_id=$1 if($zeile=~/Part ID/);
$zeile=~/$such_zahl/, $mat_typ=$1 if($zeile=~/material type/);
$zeile=~/$such_zahl/, $dichte=$1*1e6 if($zeile=~/den /);
$zeile=~/$such_zahl/, $etyp=$1 if($zeile=~/element type/);
$zeile=~/$such_zahl/, $contact_thickness=$1 if($zeile=~/contact thickness/);
if($zeile=~/thickness scale/){
$zeile=~/$such_zahl/;
$thickness_sacle=$1;
%bom=($part_id => {'pname' => $part,
'mat_typ' => $mat_typ,
'dichte' => $dichte,
'etyp' => $etyp,
'contact_thickness' => $contact_thickness,
'thickness_sacle' => $thickness_sacle,
});
}
$n-=1;
}
close (DAT);
print %bom;
print "\n\n";
my @anzahl;
my $anzahl;
foreach (keys %bom){
push @anzahl,$_;
$anzahl=@anzahl;
print $_ ."\n";
print $bom{$_};
print "\n";
print $bom{$_}->{pname} ."\n";
}
__CODE__
__demo.txt__
*******************************************************
RB_shell
Part ID ......................... 11
material type .............. 20
den .............................. = 7.8500E-06
element type ..................... = 0
optional contact thickness ....... = 0.0000E+00
optional thickness scale factor... = 0.0000E+00
**************************************************
RB_SOLID
Part ID ......................... 898
material type .............. 20
den .............................. = 7.8500E-06
element type ..................... = 0
optional contact thickness ....... = 0.0000E+00
optional thickness scale factor... = 0.0000E+00
__d3hsp__
print $anzahl ."\n";;__demo.txt__
Moin!
Das ist doch wenigstens mal eine Aufgabe. Ich bin dran.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Hallo.
der hash soll als key die Part Id und als wert eine referenz, auf eine hash erhalten. das ganze klappt hat :-) mit der einschränkung das der hash nur ein key-wert Paar hat (es müssten 12 sein). im hash ist immer nur die letzte zuweisung.
Das Ganze klappt also nicht.
ich finde meine fehler nicht kann mirjemand weiter helfen??
Zum einfachen Verbessern waren es mir zu viele Fehler, und da fastix® recht damit hat, dass das endlich mal eine richtige Aufgabe ist, und ich ein wenig Übung gut gebrauchen kann, hab' ich's dir nochmal neu geschrieben.
Ich hoffe du kannst damit was anfangen, du musst eben schauen, ob die ganzen RegExp's mit deinen Daten richtig funktionieren und ggf. noch ein paar Anpassungen machen, aber das dürfte kein großes Problem sein.
Zu deinem "!!später ausbessern!!"-Kommentar findest du übrigens in der Perl Dokumentation (http://www.perldoc.com/perl5.8.0/pod/perlretut.html#Building-a-regexp) etwas interessantes.
#!perl -w
use strict;
open(DAT,"<demo.txt") || die $!;
read(DAT,my $dat,-s DAT);
close(DAT);
my %bom;
foreach my $part (split(/\*+/,$dat))
{
next if($part =~ /^\s*$/);
my ($name,$id,$material_type,$den,$element_type,$optional_contact_thickness,$optional_thickness_scale_factor);
foreach(split(/[\r\n]+/,$part))
{
next if(/^\s*$/);
s/^\s+|\s+$//g;
if(/^\w+$/){$name = $_;}
else
{
/^([\w\s]+?)[ .=]+?([+-]?(\d+(.\d*)?|.\d+)([eE][+-]?\d+)?)$/;
if($1 eq "Part ID"){$id = $2;}
if($1 eq "material type"){$material_type = $2;}
if($1 eq "den"){$den = $2*1e6;}
if($1 eq "element type"){$element_type = $2;}
if($1 eq "optional contact thickness"){$optional_contact_thickness = $2;}
if($1 eq "optional thickness scale factor"){$optional_thickness_scale_factor = $2;}
}
}
$bom{$id} = {
name => $name,
material_type => $material_type,
den => $den,
element_type => $element_type,
optional_contact_thickness => $optional_contact_thickness,
optional_thickness_scale_factor => $optional_thickness_scale_factor
};
}
Gruß
Norbert
ich habs, was das Auslesen der Darei betrifft ein wenig variiert....
#!/usr/bin/perl -w
use strict;
my $such_zahl='([+-]?(?:\d+[.,]\d+|[.,]\d+|\d+)(?:[eE][+-]?\d+)?)'; # !!später ausbessern!!
my $n=-1;
my (%bom, $part, $part_id, $mat_typ, $dichte, $etyp, $contact_thickness, $thickness_scale);
my ($zeilenzahl, @zeilen, $zeile);
open (DAT, "< demo.txt");
$zeilenzahl=0;
while(defined($zeile=<DAT>)){
$zeilen[$zeilenzahl]=$zeile;
$zeilenzahl++;
}
close (DAT);
my $i;
for ($i=0; $i<$zeilenzahl; $i=$i+10) {
$part=$zeilen[$i+3];
$zeilen[$i+4] =~/$such_zahl/, $part_id=$1; print $part_id." | ";
$zeilen[$i+5] =~/$such_zahl/, $mat_typ=$1; print $mat_typ." | ";
$zeilen[$i+6] =~/$such_zahl/, $dichte=$1*1e6; print $dichte." | ";
$zeilen[$i+7] =~/$such_zahl/, $etyp=$1; print $etyp ." | ";
$zeilen[$i+8] =~/$such_zahl/, $contact_thickness=$1; print $contact_thickness." | ";
$zeilen[$i+9] =~/$such_zahl/, $thickness_scale=$1; print $thickness_scale."\n";
$bom{$part_id} = {
pname => $part,
material_type => $mat_typ,
dichte => $dichte,
etyp => $etyp,
contact_thickness => $contact_thickness,
thickness_scale => $thickness_scale
};
}
foreach my $key (keys %bom) {
print "Part ID:".$key."\n";
foreach(keys %{$bom{$key}}) {
print $_.":".$bom{$key}{$_}."\n";
}
}
Moin!
He Roman!
Was ist nun? Da haben sich zwei Leute nächtens hinsgesetzt und Du hast zwei Lösungen für Dein Problem. Nach dem anderen Thread und Deinem Beitrag im Forum hätte man (äh: ich) jetzt wenigstens irgendwie eine Reaktion erwartet- z.B.:
Hat (||nicht) geholfen. Danke||Es besteht noch folgendes Problem:
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
hi Jörg und Norbert,
Ihr habt mir indirekt geholfen danke dafür.
Meine Fehler lag wohl in dieser Zeile :
%bom=($part_id => {'pname' => $part,
^ --
Eure Postings waren interessant. Sie haben mir einige neue Gedankenanstöße gebracht.
Zur Zeit habe ich keine gesteigerte Lust hier zu posten daher hat es etwas länger gedauert.
bis bis roman