ottmar biebersdorf: Elementanzahl in ArraysOfArrays abfragen

Hallo Leute,

wie kann ich in Perl bei einem "mehrdimensionalen Array" die Anzahl der Elemente der einzelnen Arrays abfragen?
z.B.: wie bekomme ich im folgenden Beispiel die Anzahl der Feuersteins?

@listref = (
     [ "fred", "barney", "pebbles", "bambam", "dino", ],
     [ "homer", "bart", "marge", "maggie", ],
     [ "george", "jane", "elroy", "judy", ],
     );

sorry wenn meine Frage schon mal beantwortet wurde, habe lange gesucht und nichts gefunden.
danke im voraus,
ottmar

  1. wie bekomme ich im folgenden Beispiel die Anzahl der Feuersteins?

    @listref = (
         [ "fred", "barney", "pebbles", "bambam", "dino", ],
         [ "homer", "bart", "marge", "maggie", ],
         [ "george", "jane", "elroy", "judy", ],
         );

    hallo! Ich denke, $#{$listref[0]} sollte den höchsten Index des Feuerstein-Arrays ergeben (4).

    Hier noch 1 addiert, dann hast Du die komplette Anzahl (5) ...

    Martin

    1. Hallo Forum

      hallo! Ich denke, $#{$listref[0]} sollte den höchsten Index des Feuerstein-Arrays ergeben (4).

      ^
             Kann mir jemand (mal ganz allgemein) erklären, was diese Raute hier bedeutet ?
             Meines wissens nach ist die Raute das Kommentarzeichen in Perl.

      Grüsse
      Tom

      1. Hallo Forum

        hallo! Ich denke, $#{$listref[0]} sollte den höchsten Index des Feuerstein-Arrays ergeben (4).
                             ^
               Kann mir jemand (mal ganz allgemein) erklären, was diese Raute hier bedeutet ?
               Meines wissens nach ist die Raute das Kommentarzeichen in Perl.

        Hallo Tom,

        was die Raute 'allgemein' bedeutet, kann ich nicht sagen. Meines Wissens wird sie auch nur in diesem Fall (und als Kommentarzeichen) verwendet:

        scalar(@array) == $#array + 1;

        Die #-Schreibweise dient auch als l-Value; hiermit kann die Größe des Arrays verändert werden:

        $#array = -1 löscht alle Einträge im Array...

        Gruß,
        Martin

  2. Hallo Ottmar

    @listref = (
         [ "fred", "barney", "pebbles", "bambam", "dino", ],
         [ "homer", "bart", "marge", "maggie", ],
         [ "george", "jane", "elroy", "judy", ],
         );

    Ich kenn mich da zwar nicht so aus, aber imho ist das ueberhaupt kein mehrdimensionales Array. Eine Zuweisung wie

    @manylists = (@list0, @list1, @list2);

    ergibt keineswegs ein dreielementiges Array, wobei jedes Element wiederum ein Array ist, sondern dabei kommt ein grosses eindimensionales Array heraus, das alle Elemente der drei Listen in dieser Reihenfolge hintereinander aufgereiht enthaelt. Die vorherigen Grenzen dieser Einzel-Arrays lassen sich hinterher nicht mehr feststellen. Du kannst das ganz einfach ueberpruefen, indem Du Dir mal mit scalar(@listref) die Anzahl der Elemente ausgeben laesst, da sollte 13 rauskommen (oder vielleicht auch 17, da Du am Ende der Listen immer noch ein Komma hast - weiss nicht, ob das als weiteres leeres Element interpretiert wird).

    Wie man nun ein echtes mehrdimensionales Array in Perl anlegt, erklaert Dir besser jemand anderes. Es ist zwar nicht weiter schwer, aber ich habe trotzdem schon wieder vergessen, wie das geht. *g*

    Calocybe

    1. @manylists = (@list0, @list1, @list2);

      ergibt keineswegs ein dreielementiges Array, wobei jedes Element wiederum ein Array ist, sondern dabei kommt ein grosses eindimensionales Array heraus, das alle Elemente der drei Listen in dieser Reihenfolge hintereinander aufgereiht enthaelt. Die vorherigen Grenzen dieser Einzel-Arrays lassen sich hinterher nicht mehr feststellen. Du kannst das ganz einfach ueberpruefen, indem Du Dir mal mit scalar(@listref) die Anzahl der Elemente ausgeben laesst, da sollte 13 rauskommen (oder vielleicht auch 17, da Du am Ende der Listen immer noch ein Komma hast - weiss nicht, ob das als weiteres leeres Element interpretiert wird).

      Diese Zuweisung (@manylist) ergibt tatsächlich ein mehrdimensionales Array. Es kann ganz einfach mit $manylists[i][j] auf die einzelnen Elemente zugegriffen werden. Die Anzahl der Elemente in diesem Array ist scalar(@manylist) = $#{@manylist}+1 = 3 !!

      Das Komma am Ende der Listen macht überaschenderweise keinen Unterschied...warum auch immer...?

      Martin

      1. Hi!

        Hab mal ein bisschen rumprobiert und gelesen...

        @manylists = (@list0, @list1, @list2);
        Diese Zuweisung (@manylist) ergibt tatsächlich ein mehrdimensionales Array.

        Jein. Das was Ottmar gemacht hat ja, das was ich gemacht habe nein. Der Unterschied liegt in der Art der Klammerung. Ottmar hatte seine Sublisten in eckige Klammern [] gefasst. Mit meine @list0 usw. habe ich jedoch runde Klammern vorausgesetzt. Die runden Klammern ergeben eine normale Liste:
            @list0 = ("fred", "barney", "pebbles", "bambam", "dino");
        Doch die eckigen Klammern legen eine anonyme Liste an und erzeugen dann eine Referenz (Pointer) darauf:
            $listref = ["fred", "barney", "pebbles", "bambam", "dino"];

        Bei der ersten Variante greift man mit $list0[2] auf ein Element zu, bei zweiten dagegen mit $$listref[2], was die Kurzform fuer ${$listref}[0] ist.

        Ein mehrdimensionales Array wird in Perl so angelegt, dass entlang der einen Dimension einfach Referenzen auf Arrays aufgenommen werden, die dann jeweils in die naechste Dimension zeigen. Kurz gesagt, genau so wie es Ottmar gemacht hat.

        Zwei Testprogramme:

        @list0 = ("0.0", "0.1", "0.2", "0.3", "0.4");
        @list1 = ("1.0", "1.1", "1.2", "1.3", "1.4");
        @list2 = ("2.0", "2.1", "2.2", "2.3", "2.4");

        @manylists = (@list0, @list1, @list2);

        print scalar (@manylists[0]);
        <<<<<<
        hat als Output die einzige Zeile
        15

        $list0 = ["0.0", "0.1", "0.2", "0.3", "0.4"];
        $list1 = ["1.0", "1.1", "1.2", "1.3", "1.4"];
        $list2 = ["2.0", "2.1", "2.2", "2.3", "2.4"];

        @manylists = ($list0, $list1, $list2);

        print scalar @manylists, "\n";
        print scalar @{$manylists[0]}, "\n";        # <-- Hier Ottmar, da erhaelst Du die Anzahl des 0. Subarrays
        print $#{$manylists[0]}, "\n";

        print scalar @{$manylists[0]}[1], "\n";
        print scalar $manylists[0]->[1], "\n";
        print scalar $manylists[0][1], "\n";
        <<<<<<
        hat als Output:
        3
        5
        4
        0.1
        0.1
        0.1

        Ok, hoffe wir haben alle Klarheiten beseitigt.
        Calocybe

        P.S. Ach ja, genauso wie [] Referenzen auf anonyme Arrays erzeugen, kann man mit {} Refs auf anonyme Hashes erhalten. Steht aber alles in der perlref manpage (http://www.activestate.com/ActivePerl/docs/lib/Pod/perlref.html).

        1. Hi!

          Hab mal ein bisschen rumprobiert und gelesen...

          @manylists = (@list0, @list1, @list2);
          Diese Zuweisung (@manylist) ergibt tatsächlich ein mehrdimensionales Array.

          Jein. Das was Ottmar gemacht hat ja, das was ich gemacht habe nein. Der Unterschied liegt in der Art der Klammerung. Ottmar hatte seine Sublisten in eckige Klammern [] gefasst. Mit meine @list0 usw. habe ich jedoch runde Klammern vorausgesetzt. Die runden Klammern ergeben eine normale Liste:
              @list0 = ("fred", "barney", "pebbles", "bambam", "dino");
          Doch die eckigen Klammern legen eine anonyme Liste an und erzeugen dann eine Referenz (Pointer) darauf:
              $listref = ["fred", "barney", "pebbles", "bambam", "dino"];

          Damit hast Du natürlich vollkommen recht. Ich hatte Deine Listen @list0 als Referenzen aufgefasst, wie im Beispiel von Ottmar. Du hast sie aber korrekt als Arrays (@) und nicht als refs deklariert.

          Die Zuweisung

          @list = ["fred", "barney",...];

          würde ja eine Liste von Referenzen auf Listen erzeugen! In diesem Fall eben nur mit einem Element.

          Was so eine Klammer alles ausmachen kann...

          Martin

          1. Hallo Leute,

            vielen Dank für eure umfassenden Antworten.
            Läuft auch alles inzwischen wie ich es mir vorgestellt habe. Damit das auch so bleibt suche ich noch ein gutes Buch zu Perl (kann auch in Englisch sein). Ich habe zwar "Perl in a nutshell", aber als Anfänger ist das wohl doch etwas zu knapp. Es gibt da ja noch so einiges von demselben Verlag, hat jemand eine Empfehlung?

            viele Grüße
            ottmar

            1. Hallo Leute,

              vielen Dank für eure umfassenden Antworten.
              Läuft auch alles inzwischen wie ich es mir vorgestellt habe. Damit das auch so bleibt suche ich noch ein gutes Buch zu Perl (kann auch in Englisch sein). Ich habe zwar "Perl in a nutshell", aber als Anfänger ist das wohl doch etwas zu knapp. Es gibt da ja noch so einiges von demselben Verlag, hat jemand eine Empfehlung?

              O'Really: Programming Perl von Larry Wall, Tom Christiansen & Randal L. Schwartz