Slobodan: Perl: Geht das einfacher?

Hallo Leute, erstmal "ALLES GUTE IM 1999" !!!

und jetzt zur Sache:

Im Vorfeld zu sagen ich habe das Problem gelöst, aber scheint mir
das irgendwie zu kompliziert (und zu lang) gelöst zu sein. Wenn also
jemand Lust auf ein "verschachteltes Algoritmus" hat soll weiterlesen,
der Rest kann weitersurfen ;-]

Problem:
Wir haben eine "Datenbank" wo die felder ungef. so aufgebaut sind:

A;A1
A,A2
A;A3
.usw   Anzahl nicht definiert
B;A1
.usw   Anzahl nicht definiert  
C;C1
.usw   Anzahl nicht definiert

ZIEL: Namen (Werte) der Spalten in Variablen zu speichern mit Bezug auf Position in der Reihenfolge.

Die Gruppen sind schon in $GG (A,B,C) und $PG (A1;A2;A3) eingelesen worden.
Hier der Code:
Sieht ein wenig haotisch und die Variablennamen sind in meine LS geschrieben. ;-)

#################################

untergruppen- und gruppenanzahl ermittlen

#################################
$sad = "";   # jetzt - $GG
$prije = "";   # vorhin - $GG
$i = 0;                         # zähler
$broj_promjena = 0;  # wechsel der I-Spalte
$broj_podgrupa = 0;  # II-Spalte: anzahl der Gruppen
until($i eq $Reihen+1) {   # schleife
   $sad = $GG[$i];                 #
   if($sad ne $prije)  # el. erster in der gruppe ?
   {                  # neue gruppe anfangen
    $broj_promjena++;  # wechsel (gruppenanzahl) um 1 erhöhen
    $broj_podgrupa = 1;         # neue untergruppe angfangen
    $grupa[$broj_promjena] = $broj_podgrupa; #
    $ime_gg[$broj_promjena] = $sad;
    $v_pg[$broj_promjena][$broj_podgrupa] = $PG[$i];
   } else {                    # nicht erster in der gruppe
    $broj_podgrupa++;  # untergruppenanzahl um 1 erh.
    $grupa[$broj_promjena] = $broj_podgrupa;
    $ime_gg[$broj_promjena] = $sad;
    $v_pg[$broj_promjena][$broj_podgrupa] = $PG[$i];
   }                         #
$prije = $GG[$i];               # vorhin = jetzt
$i++;                           # zähler hohe stellen
}                               # neuzyklus
$Broj_GG = $broj_promjena+1; # Hauptgruppenanzahl
#################################
und in den Variablen $ime_gg[hauptgruppe-zahl]
haben wir jetzt die namen aus der 1. Spalte
und in der Variable $v_pg[hauptgruppe-zahl][untergruppe-zahl]
haben wir die namen aus der 2. Spalte.

Sorry für die, die es nicht verstanden haben...

Wie gesagt, das funktioniert in der Praxis
und Perl ist bekannt dafür das er versch.
Wege zum einen Ziel ermöglicht und deswegen ...

ICH SUCHE EINEN KÜRZEREN WEG ZUM GLEICHEM ZIEL [ENDVARIABLEN].

Hat jemand eine Idee wie man das besser machen kann ?
Es kann auch als Hobby-Aufgabe oder Effizienzübung verstanden werden.

Viele Grüße,

Slobo

  1. hi!

    ZIEL: Namen (Werte) der Spalten in Variablen zu speichern mit Bezug auf Position in der Reihenfolge.

    OK, ich hab mich wirklich bemüht. Ich hab zehn Minuten vor dem Stück Quellcode gesessen, aber trotzdem nicht verstanden, was du da genau machst. So ziemlich alles an deinem Quellcode kommt mir irgendwie umständlich oder unverständlich vor... Deshalb versuche ich es mal von Anfang an komplett neu.

    Zuallererst: Schau dir vor allem die Perl-Funktion push an, vielleicht bringt dich das allein schon weiter.

    OK, los geht's:
    === cut ===
    #!/usr/bin/perl

    wir lesen zuallererst mal alle Zeilen der Datei in eine Liste ein

    open DATEI, "<database.txt";
    @lines = <DATEI>;
    close DATEI;

    dann bearbeiten wir jede Zeile einzeln

    for (@lines)
    {
      # wir splitten jede Zeile in die Hauptgruppe und die Untergruppe auf
      ($grp, $subgrp) = split /;/;
      # wir entfernen das letzte Zeichen = das Newline-Zeichen
      chop $subgrp;
      # wenn wir jetzt bei einer anderen Hauptgruppe sind als vorher...
      if ($lastgrp ne $grp)
      {
        # ...dann definieren wir eine neue letzte Hauptgruppe
        $lastgrp = $grp;
        # ...und erweitern das Array der Hauptgruppen um die neue Gruppe
        push @groups, $grp;
      }
      # abschließend hängen wir an das Array, das die Untergruppen der aktuellen Hauptgruppe
      # speichert, die neue Untergruppe an
      push @{ $subgroups[$#groups] }, $subgrp;
    }

    zum testen ein bisschen was auf den Bildschirm schreiben

    print @groups, "\n";
    print @{ $subgroups[0] };

    === cut ===

    Das war's auch schon, und ich finde es übersichtlicher als vorher. Ich hoffe, das war, was du wolltest.
    $groups[0] ist jetzt der Name der ersten Hauptgruppe, $groups[1] der Name der zweiten Hauptgruppe, etc.
    $subgroups[0][0] ist der Name der ersten Untergruppe von der ersten Hauptgruppe, $subgroups[1][2] ist der Name der dritten Untergruppe von der zweiten Hauptgruppe, etc.

    bye, Frank!

    1. Also,

      ich wurde sagen - brilliant! ;-)

      Das ist der Perl ... mann kann es so oder "so" machen.

      Mein Code war ein Beispiel (jetzt ist offensichtlich) für Unübersichtlichkeit. Ein Negativ-Beispiel ... und
      trotzdem läuft der.
      Jeder kann und soll sein Programmierstil verbessern,
      besonderes bei Perl (...blummen...) ist das sichtbar.

      Danke das war was ich wollte !

      Slobo

      1. tja, das gilt aber für jede andere Sprache auch!