Leeloo5E: Array in nem Array

Hallo zusammen,

ich bastele mal wieder in Perl rum und müsste nun ein Array in nem Array bauen. Also

  
  my @array = (@arr1, @arr2, @arr3);  

Die Werte sollen dann so da rein:

  
  push @array[0], $wert0;  
  push @array[1], $wert1;  
  push @array[2], $wert2;  

Allerdings meckert der Perlinterpreter rum und sagt, push geht net fürn splice. Mit nur $array[0], sagt er, das is kein Array. Wie krieg ich denn aber nun meine Werte an die richtige Stelle?
Oder soll ich das mit nem Hash probieren? Wie gehts damit?

Gruß,
Leeloo

--
"Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
  1. ich bastele mal wieder in Perl rum und müsste nun ein Array in nem Array bauen. Also

    my @array = (@arr1, @arr2, @arr3);

      
    Wenn du wirklich das willst, dann so:  
      
    my @array = (\@arr1, \@arr2, \@arr3);  
      
    Struppi.
    
    -- 
    [Javascript ist toll](http://javascript.jstruebig.de/) (Perl auch!)
    
    1. Hallo,

      Wenn du wirklich das willst, dann so:

      my @array = (@arr1, @arr2, @arr3);

      Werden damit nicht nur die Elemente der einzelnen Arrays hintereinander in das "Oberarray" geschrieben? Dann ist da ja auch nur wieder ein normales Array!?
      Das Problem ist, dass die Anzahl der Arrays in dem Array variiert. Ich die aber trotzdem so brauche.
      Ich glaub, der Link von Siechfried bringt mich da weiter.
      Trotzdem danke.

      Gruß,
      Leeloo

      --
      "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
      1. Wenn du wirklich das willst, dann so:

        my @array = (@arr1, @arr2, @arr3);

        Werden damit nicht nur die Elemente der einzelnen Arrays hintereinander in das "Oberarray" geschrieben? Dann ist da ja auch nur wieder ein normales Array!?

        Nein, im gegenteil deine Variante macht das.

        Ich glaub, der Link von Siechfried bringt mich da weiter.

        Das was ich dir gezeigt habe ist ein Array of Arrays.

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. Hallo,

          Wenn du wirklich das willst, dann so:

          my @array = (@arr1, @arr2, @arr3);

          Werden damit nicht nur die Elemente der einzelnen Arrays hintereinander in das "Oberarray" geschrieben? Dann ist da ja auch nur wieder ein normales Array!?

          Das was ich dir gezeigt habe ist ein Array of Arrays.

          Ich glaub, damit komm ich doch nicht so recht weiter.
          Bin dem Link von Siechfred gefolgt und da is ja eigentlich das, was ich will, allerdings funzt das doch net so recht. Jetzt hab ich Probleme mit der Ausgabe.
          Zuerst bau ich mir per

            
           push @{$dataset[$i]}, $entrycount;  
          
          ~~~ mein Array @dataset, was ich natürlich vorher definiert habe mit `my @dataset;`{:.language-perl}  
          Soweit so gut. Nur an der Ausgabe scheitert es. Wenn ich sowas  
          ~~~perl
            
           for my $aref ( @dataset ) {  
            print "\t [ @$aref ],\n";  
           }#end for  
          #oder  
           for my $i (0 .. $#dataset) {  
            print [@{$dataset[$i]}];  
           }#end for  
          
          ~~~ mache, kommt immer nur ne Fehlermeldung:  
          Can't use an undefined value as an ARRAY reference at ...  
            
          Das ist zum Heulen. ;-(  
            
          Gruß,  
          Leeloo
          
          -- 
          "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
          
          1. for my $aref ( @dataset ) {
              print "\t [ @$aref ],\n";
            }#end for

            eigentlich sollte das funktioneren.

            tut es auch:
            [code lang=perl]#! /usr/bin/perl -w
            use strict;
            my @dataset =
            (
            [ qw(a0 b0 c0) ],
            [ qw(a1 b1 c1) ],
            [ qw(a2 b2 c2) ]
            );

            for my $aref ( @dataset ) {
               print "\t [ @$aref ],\n";
              }#end for

              
            Struppi.
            
            -- 
            [Javascript ist toll](http://javascript.jstruebig.de/) (Perl auch!)
            
            1. Hallo,

              for my $aref ( @dataset ) {
                print "\t [ @$aref ],\n";
              }#end for

              eigentlich sollte das funktioneren.

              tut bei mir aber net
              ich befülle mein array ja aber nicht so
              [code lang=perl]

              my @dataset =
              (
              [ qw(a0 b0 c0) ],
              [ qw(a1 b1 c1) ],
              [ qw(a2 b2 c2) ]
              );

              sondern mit push, wie auf der Seite beschrieben. Nun komm ich aber nimmer ran an die einzelnen Teile des Arrays. \*grmpf\*  
                
              Kann man erstmal so ein leeres Array in nem Array anlegen? Also so:  
              ~~~perl
                
               my @dataset = ( [],[],[],[], ...);  
              
              

              Und dann später mit push befüllen?

              Ich brauch das ganze, um nen Balkendiagramm zu erstellen. Ich hab pro Datum (x-Achse) verschiedene Kategorien von denen auch nicht jede an jedem Tag vorhanden ist. Dies steht inna DB und die gibt mir eben die Werte: Datum, Anzahl (Höhe y-Achse), Kategorie aus. Ich habe allerdings eine dynamische Anzahl von Kategorien, da der Nutzer wählen kann, welche Kategorien er angezeigt bekommen möchte. D.h. für jede Kategorie wird ein Array mit Werten angelegt. Und um das eben dynamisch zu halten, sollen diese vielen Arrays gleich in ein Oberarray gepackt und dort befüllt werden. Am Ende soll das ganze wieder mit ner for-Schleife ins Diagramm gesetzt werden (mit set). Vor einem Problem stehe ich allerdings noch: Was mache ich, wenn es an einem Tag eine Kategorie nicht gibt? Die muss dann mit 0 befüllt werden an der Stelle. Aber erstmal muss ja das simpelste funktionieren ...
              (Manchmal hilfts ja das Problem nochmal aufzuschreiben. Aber diesmal irgendwie nicht ... hm)

              Gruß,
              Leeloo

              --
              "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
              1. Hallo,

                (Manchmal hilfts ja das Problem nochmal aufzuschreiben. Aber diesmal irgendwie nicht ... hm)

                Doch, es hat geholfen: Knoten geplatzt. Die Unterarrays mit push zu befüllen, funzt wohl net, wenn man anschließend mit

                  
                for $aref ( @AoA ) {  
                     print "\t [ @$aref ],\n";  
                 }  
                
                

                versucht das Array auszugeben.
                Befülle ich es jedoch per $AoA[0][1] o.ä., funzt oberer Ausgabecode und damit kann ich auch die Arrays mit Nullen befüllen *freu* Es geht ...

                Gruß,
                Leeloo

                --
                "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
                1. Doch, es hat geholfen: Knoten geplatzt. Die Unterarrays mit push zu befüllen, funzt wohl net, wenn man anschließend mit

                  doch klar kann man, aber du machst es offensichtlich nicht richtig.

                  use strict;  
                  my @dataset;  
                    
                  my @a = qw(1 2 3);  
                  my @b = qw(1 2 3);  
                    
                  # entweder so:  
                  push @dataset, \@a;  
                  push @dataset, \@b;  
                    
                  # oder so:  
                  push @dataset, [ @a ];  
                  push @dataset, [ @b ];
                  

                  Struppi.

                  --
                  Javascript ist toll (Perl auch!)
                  1. Hallo,

                    Doch, es hat geholfen: Knoten geplatzt. Die Unterarrays mit push zu befüllen, funzt wohl net, wenn man anschließend mit

                    doch klar kann man, aber du machst es offensichtlich nicht richtig.

                    use strict;

                    my @dataset;

                    my @a = qw(1 2 3);
                    my @b = qw(1 2 3);

                    entweder so:

                    push @dataset, @a;
                    push @dataset, @b;

                    oder so:

                    push @dataset, [ @a ];
                    push @dataset, [ @b ];

                      
                    Ich bestreite nicht, dass dies auch eine Möglichkeit ist, ein Array mit einem Array zu befüllen. Allerdings kann ich die Einzel-Arrays nicht derart vordefinieren wie zuvor schon beschrieben. Ich wollte das ganze mit  ` push @{ $AoA[0] }, "wilma", "betty"; `{:.language-perl} befüllen und dann per ` for my $aref ( @dataset ) { print "\t [ @$aref ],\n"; }#end for ausgeben `{:.language-perl} und das ging net.  
                      
                    Gruß,  
                    Leeloo
                    
                    -- 
                    "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
                    
                    1. Ich bestreite nicht, dass dies auch eine Möglichkeit ist, ein Array mit einem Array zu befüllen. Allerdings kann ich die Einzel-Arrays nicht derart vordefinieren wie zuvor schon beschrieben. Ich wollte das ganze mit  push @{ $AoA[0] }, "wilma", "betty"; befüllen

                      Das geht tatsächlich nur, wenn in $AoA[0] bereits eine Liste initialisiert wurde. d.h. entweder, wenn du weißt wieviele Listen du brauchst sowas in der Art (geht natürlich auch als Schleife):
                      my @AoA = (
                      [], [], ... usw.
                      )

                      oder, während des Ablaufes prüfen ob die Referenz bereits vorhanden ist.

                      $AoA[0] = [] unless $AoA[0]; # oder ref auf ARRAY checken  
                      push @{ $AoA[0] }, ["wilma", "betty"];  
                      
                      

                      Hier musst du auch die Elemente zu einer Listenreferenz machen.

                      Struppi.

                      --
                      Javascript ist toll (Perl auch!)
  2. ich bastele mal wieder in Perl rum und müsste nun ein Array in nem Array bauen.

    Warum liest du nicht die Dokumentation dazu?
    http://perldoc.perl.org/perldsc.html#ARRAYS-OF-ARRAYS-array-of-arrays-AoA

    Siechfred

    --
    Ich bin strenggenommen auch nur interessierter Laie. (molily)
    Zitat des Tages || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
    1. Hallo,

      Warum liest du nicht die Dokumentation dazu?
      http://perldoc.perl.org/perldsc.html#ARRAYS-OF-ARRAYS-array-of-arrays-AoA

      Sorry, hab ich nicht gefunden. Danke. Werd mir das mal anschauen.

      Gruß,
      Leeloo

      --
      "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
  3. Hey,
    du lernst grade Referenzen und komplexe Datenstrukturen. Benutze Module wie Data::Dumper oder besser Data::Dump::Streamer, um dir Variablen ausgeben zu lassen. So siehst du die Zusammenhänge und Abhängigkeiten viel besser.

    --
    水-金-地-火-木-土-天-海-冥