roman lenz: hash (oder einfach mal kein dummes zeug reden)

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__

  1. Moin!

    Das ist doch wenigstens mal eine Aufgabe. Ich bin dran.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
  2. 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.

    Na ja, hier ist das Dingen:

    #!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
                  };
     }

    foreach my $key (keys %bom)
     {
      print "Part ID = $key\n";
      foreach(keys %{$bom{$key}})
       {
        print "  $_ = $bom{$key}{$_}\n";
       }
      print "\n";
     }

    Gruß
    Norbert

  3. 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";
      }
    }

    1. 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®

      --
      Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
  4. 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