Peter: Array auf Array?

Moin!

Ich habe ein kleines Problem:
Ich lese ein Verzeichniss an mit n Elementen. Diese Dateien (n)
möchte ich nun jeweils in einen Array schreiben. Die Anzahl
kann aber je  Zahl der Daten varieren, desewegen muss ich die
Vergabe des Array "dynamisch" machen. Das bedeutet, ich habe
im Prinzig n.Elemente die jeweils einen Array darstellen, diese
n-Array sollen  aber auch miteinander verbunden sein.
Kann mir jemand bitte helfen?

mfg

the real Peter

  1. Hallo Peter,

    Wenn ich dich richtig verstanden habe, möchtest Du ein mehrdimensionales Array erstellen.
    Das geht in Perl nur über Referenzen, da Elemente eines Arrays nur skalare Werte enthalten können (z.B.: Referenzen)

    foreach (@liste_der_verzeichnisse) {
      # hier alle Dateien des verzeichnisses einlesen
      # dann entweder in ein Array speichern:
      # a) mit push()
      push @verzeichnisse, [@dateien];
      # b) als Zuweisung
      $verzeichnisse[$i++] = [@dateien];
      # oder unter dem Verzeichnispfad als Schluessel in einem Hash speichern
      $verzeichnisse{$_} = [@dateien];
    }

    Die eckigen Klammern um das Array erzeugen eine anonyme Liste/Array, also eine Referenz auf eine Liste von Werten (oder so ähnlich ;-)

    Zugriff mit:
      $verzeichnisse[$i]->[$j];
    oder
      $verzeichnisse{$verzeichnis}->[$j];

    Wenn Du nur die Listen/Arrays vereinigen möchtest, kanns Du es wie folgt machen:
      push @allfiles, @dateien1, @dateien2; # geht so auch in einer Schleife
    oder:
      @allfiles = @dateien1, @dateien2;  # erneute Zuweisung würde @allfiles überschreiben

    Das obige funktioniert, weil Perl Arrays in lineare Listen umwandeln kann und es auch tut. Das ist afaik ein weiterer Grund, warum ein mehrdimensionales Array über Referenzen aufgebaut werden muss. (Aber das ist imho ein Henne/Ei-Paradoxon ;-)

    hth

    Gruß AlexBausW

    Please visit my SELFvisitingcard @ http://www.atomic-eggs.com/selfspezial/daten/150.html

    1. Hallo Me,

      Arrgh, Sorry:

      @allfiles = @dateien1, @dateien2;  # erneute Zuweisung würde @allfiles überschreiben

      ^....................^.....*

      *) es fehlen die Klammern (). Eben redete ich noch was vom höheren Vorrang des Zuweisungsoperatoren gegenüber dem Kommaoperatoren (<107419.html>), und schon lasse ich es wieder außer Acht (was interressiert mich mein Geschwätz von gestern? ;-))
      Korrekt muss es also:
        @allfiles = (@dateien1, @dateien2);
      lauten.

      Gruß AlexBausW

    2. Hi alex,

      foreach (@liste_der_verzeichnisse) {
        # hier alle Dateien des verzeichnisses einlesen
        # dann entweder in ein Array speichern:
        # a) mit push()
        push @verzeichnisse, [@dateien];
        # b) als Zuweisung
        $verzeichnisse[$i++] = [@dateien];
        # oder unter dem Verzeichnispfad als Schluessel in einem Hash speichern
        $verzeichnisse{$_} = [@dateien];
      }

      eine mir wesentlich sympatischere Lösung wäre die hier:
      foreach (@liste_der_verzeichnisse)
      {
        # hier alle Dateien des verzeichnisses einlesen
        # dann entweder in ein Array speichern:
        # a) mit push()
        push(@verzeichnisse,@dateien);
        # b) als Zuweisung
        $verzeichnisse[$i++] = @dateien;
        # oder unter dem Verzeichnispfad als Schluessel in einem Hash speichern
        $verzeichnisse{$_} = @dateien;
      }

      Zugriff mit:
      print $$verzeichnisse[$i][$j];

      oder
      print $$verzeichnisse{$verzeichnis}[$j];

      mfg
      CK1