Leeloo5E: 0 Werte rauswerfen

Hallo,

ich hab mir erfolgreich ein Array in nem Array gebastelt. Das sieht dann ungefähr so aus:

  
 @AoA = (  
        [ 0, 0, 0 ],  
        [ 215, 2, 1234 ],  
        [ 0, 5, 10 ],  
        [ 0, 278, 0],  
      );  

Auf dessen Grundlage baue ich mir ein Diagramm mit horizontalen (waagerechten) Balken. Da sind die 0-Einträge erstmal egal.
Auf derselben Daten-Grundlage soll nun ein Kuchen/Torten-Diagramm erstellt werden. Da stören die 0-Einträge nur. Es gibt für die Diagramme ja das Attribut "costum_x_ticks" womit man sagen kann, die und die sollen gezeichnet werden. Allerdings funktioniert das eben nicht für ein KuchenDiagramm (Pie) und auch nicht für HorizontalBars.
Darüber hinaus, müsste ich ja eh vorher heraus bekommen, an welchen Stellen nur 0-Werte drin stehen, um diese dann rauszukicken. Hat jemand einen Tipp für mich, wie ich das am blödesten anstelle?

THX

Gruß,
Leeloo

--
"Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
  1. Darüber hinaus, müsste ich ja eh vorher heraus bekommen, an welchen Stellen nur 0-Werte drin stehen, um diese dann rauszukicken. Hat jemand einen Tipp für mich, wie ich das am blödesten anstelle?

    wo ist das Problem?

    my $x = 0;
    print "x ist null" unless $x;

    Struppi.

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

      Darüber hinaus, müsste ich ja eh vorher heraus bekommen, an welchen Stellen nur 0-Werte drin stehen, um diese dann rauszukicken. Hat jemand einen Tipp für mich, wie ich das am blödesten anstelle?

      wo ist das Problem?

      darin vielleicht, dass du den Thread nicht ganz gelesen hast!?

      my $x = 0;
      print "x ist null" unless $x;

      wie bringt mich das weiter?

      Gruß,
      Leeloo

      --
      "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
      1. wo ist das Problem?

        darin vielleicht, dass du den Thread nicht ganz gelesen hast!?

        Doch hab ich, aber was hat der Verwendungszweck damit zu tun, dass du nicht weißt wie man auf Nullwerte prüft?

        my $x = 0;
        print "x ist null" unless $x;

        wie bringt mich das weiter?

        So kann z.b. der Vergleich aussehen mit dem du die Nullwerte rausschmeissen kannst.

        Struppi.

        --
        Javascript ist toll (Perl auch!)
  2. Moin!

    Da ich keine Torten-, Balken- oder wasweißich Diagramme in Perl kenne, habe ich mich mal darauf beschränkt, nur die Nullwerte zu entfernen:

      
    use Data::Dumper;  
    use strict;  
    use warnings;  
      
    my @AoA = (  
            [ 0, 0, 0 ],  
            [ 215, 2, 1234 ],  
            [ 0, 5, 10 ],  
            [ 0, 278, 0],  
          );  
      
    my @NoNull= map { [ grep { $_ } @$_ ] } @AoA;  
      
      
    print Dumper(\@NoNull);  
      
    __END__  
    Ergebnis:  
    $VAR1 = [  
              [],  
              [  
                215,  
                2,  
                1234  
              ],  
              [  
                5,  
                10  
              ],  
              [  
                278  
              ]  
            ];  
      
    
    

    -- Skeeve

    1. Hallo Skeeve,

      danke erstmal. Vielleicht hab ichs etwas unglücklich formuliert. Es sollen nur die Einträge raus, wo überall Nullen sind:

      my @AoA = (
              [ 0, 0, 0 ],
              [ 215, 2, 1234 ],
              [ 0, 5, 10 ],
              [ 0, 278, 0],
            );

      Das Array soll am Ende dann so aussehen:

        
      @AoAohneNull = (  
               [ 215, 2, 1234 ],  
               [ 0, 5, 10 ],  
               [ 0, 278, 0],  
             );  
      
      

      D.h. wo die alles Nullen drin sind, soll komplett rausfallen. Hab derweil splice gefunden, um das rauswerfen zu realisieren. Ich müsste dann aber eben überprüfen, welches der einzelnen Arrays nur Element hat, deren Wert eben 0 ist.

      Gruß,
      Leeloo

      --
      "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
      1. Das Array soll am Ende dann so aussehen:

        @AoAohneNull = (
                 [ 215, 2, 1234 ],
                 [ 0, 5, 10 ],
                 [ 0, 278, 0],
               );

          
        und das wäre nicht möglich gewesen vorher zu zeigen?  
          
        Dann wäre klarer gewesen, was du mit "Nullwerten" meinst, denn keiner weiß was oder wie du Tortendiagramme machst.  
          
        Struppi.
        
        -- 
        [Javascript ist toll](http://javascript.jstruebig.de/) (Perl auch!)
        
        1. Hallo,

          Das Array soll am Ende dann so aussehen:

          @AoAohneNull = (
                   [ 215, 2, 1234 ],
                   [ 0, 5, 10 ],
                   [ 0, 278, 0],
                 );

          
          >   
          > und das wäre nicht möglich gewesen vorher zu zeigen?  
            
          doch bestimmt. hat ich nur grad net dran gedacht, das doch noch genauer zu erklären. ganz großes sorry. für mich war klar, was ich meinte. für die anderen sicher net.  
          
          >   
          > Dann wäre klarer gewesen, was du mit "Nullwerten" meinst, denn keiner weiß was oder wie du Tortendiagramme machst.  
            
          Ich mal Tortendiagramme mit Chart::Pie. Mit was sonst? Man soll sich doch das Leben nicht schwerer machen als es ist, oder!?  
            
          Gruß,  
          Leeloo
          
          -- 
          "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
          
          1. und das wäre nicht möglich gewesen vorher zu zeigen?

            doch bestimmt. hat ich nur grad net dran gedacht, das doch noch genauer zu erklären. ganz großes sorry. für mich war klar, was ich meinte. für die anderen sicher net.

            so sieht's aus, also ich würd's so machen, bin aber nicht so vertraut mit grep und map die in irgendeiner Kombination sicher auch funktionieren:

            my @AoA = (  
                    [ 0, 0, 0 ],  
                    [ 215, 2, 1234 ],  
                    [ 0, 5, 10 ],  
                    [ 0, 278, 0],  
            );  
            my @NoNull = cleanup_AoA( \@AoA );  
              
            print Dumper(\@NoNull);  
              
            sub cleanup_AoA  
            {  
               my $arr = shift;  
               my @new;  
               foreach(@$arr)  
               {  
                     my $null = 0;  
                     foreach(@$_)  
                     {  
                         $null = 1, last if $_;  
                     }  
                     push @new, $_ if $null;  
               }  
               return wantarray ? @new : \@new;  
            }
            

            Dann wäre klarer gewesen, was du mit "Nullwerten" meinst, denn keiner weiß was oder wie du Tortendiagramme machst.

            Ich mal Tortendiagramme mit Chart::Pie. Mit was sonst? Man soll sich doch das Leben nicht schwerer machen als es ist, oder!?

            Schon klar, aber du kannst natürlich nicht damit rechnen, dass jeder jedes CPAN Modul kennt, ich hatte noch nie mit Diagrammen und Perl zu tun.

            Struppi.

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

              so sieht's aus, also ich würd's so machen, bin aber nicht so vertraut mit grep und map die in irgendeiner Kombination sicher auch funktionieren:

              my @AoA = (

              [ 0, 0, 0 ],
                      [ 215, 2, 1234 ],
                      [ 0, 5, 10 ],
                      [ 0, 278, 0],
              );
              my @NoNull = cleanup_AoA( @AoA );

              print Dumper(@NoNull);

              sub cleanup_AoA
              {
                 my $arr = shift;
                 my @new;
                 foreach(@$arr)
                 {
                       my $null = 0;
                       foreach(@$)
                       {
                           $null = 1, last if $
              ;
                       }
                       push @new, $_ if $null;
                 }
                 return wantarray ? @new : @new;
              }

              
              >   
                
              Danke für die Anregung. Funktionieren tuts erstmal :-) Allerdings hängen noch andere Arrays dran, die ich dann auch anpassen muss. Aber das werd ich dann schon irgendwie hinkriegen ;-)  
                
              
              > > Ich mal Tortendiagramme mit Chart::Pie. Mit was sonst? Man soll sich doch das Leben nicht schwerer machen als es ist, oder!?  
              >   
              > Schon klar, aber du kannst natürlich nicht damit rechnen, dass jeder jedes CPAN Modul kennt, ich hatte noch nie mit Diagrammen und Perl zu tun.  
                
              Sorry, klar ist klar, dass sich nicht jeder mit allen CPAN-Modulen auskennt. Allerdings scheinst du recht kompetent zu sein, was Perl betrifft. Da könnte man vermuten, dass du auch andere diverse Module von Perl kennst.  
              Ich selbst versuche mich auch das erste Mal an Diagrammen. Die Doku dazu ist recht gut. Allerdings suche ich auch da noch nach Attributen, die mir die bessere Anzeige im Diagramm ermöglichen. Bisher hab ich aber noch nix gefunden. Na dann muss es erstmal so gehen.  
                
              Gruß,  
              Leeloo
              
              -- 
              "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
              
            2. Moin!

              so sieht's aus, also ich würd's so machen, bin aber nicht so vertraut mit grep und map die in irgendeiner Kombination sicher auch funktionieren:

              Na klar tun sie das:

                
              use Data::Dumper;  
              use strict;  
              use warnings;  
                
              my @AoA = (  
                      [ 0, 0, 0 ],  
                      [ 215, 2, 1234 ],  
                      [ 0, 5, 10 ],  
                      [ 0, 278, 0],  
                    );  
                
              my @NoNull= grep { scalar( grep { $_ } @$_ ) } @AoA;  
                
              print Dumper(\@NoNull);  
                
              __END__  
              Ergebnis  
              $VAR1 = [  
                        [  
                          215,  
                          2,  
                          1234  
                        ],  
                        [  
                          0,  
                          5,  
                          10  
                        ],  
                        [  
                          0,  
                          278,  
                          0  
                        ]  
                      ];  
                
              
              

              Hausaufgabe: Erkläre die Funktionsweise des Scripts!

              Ich mal Tortendiagramme mit Chart::Pie. Mit was sonst? Man soll sich doch das Leben nicht schwerer machen als es ist, oder!?

              Schon klar, aber du kannst natürlich nicht damit rechnen, dass jeder jedes CPAN Modul kennt, ich hatte noch nie mit Diagrammen und Perl zu tun.

              Ganz genau! Mal abgesehen davon:
              1. Nicht jeder erstellt überhaupt Diagramme mit Perl
              2. Eventuell erstellen wir sie mit einem anderen Modul
              3. Wie soll man zu einem Modul was sagen, wenn Du (also der OP) es nichtmal nennt...

              Naja... "Schwamm drüber" wie Mr. Fish immer zu sagen pflegte...

              -- Skeeve

              1. my @NoNull= grep { scalar( grep { $_ } @$_ ) } @AoA;

                ...

                Hausaufgabe: Erkläre die Funktionsweise des Scripts!

                ;-)

                Verstehen tu ich's, aber selber draufkommen gelingt mir nicht.
                grep erstellt eine Liste aus den Elementen, die die Bedingung erfüllen.

                Man muss immer von hinten nach vorne gehen um solche Konstrukte zu verstehen (vermutlich ist das mein Problem)

                my @NoNull= grep { scalar( grep { $_ } @$_ ) } @AoA;

                Jedes Element der Liste @AoA wird Dereferenziert ( @$_) -->
                die Liste, die das innere grep zurückgibt enthält nur die Werte, die <> 0 oder undefined sind -->
                hat eine dieser Listen nur "Nullwerte", ist diese Liste leer -->
                die Umwandlung in einen Skalar ergibt in dem Fall 0 -->
                dadurch gibt das äußere grep nur die Arrayreferenzen zurück, die mindestens einen Wert haben.

                Wäre ich nie drauf gekommen, ist aber ganz logisch ;-)

                Struppi.

                --
                Javascript ist toll (Perl auch!)
                1. Moin!

                  100% richtig!

                  Wäre ich nie drauf gekommen, ist aber ganz logisch ;-)

                  ;-) Listenverarbeitung liebe ich... Ich finde LISP ist eine schöne Sprache ;-)

                  -- Skeeve

              2. Hallo,

                Moin!

                so sieht's aus, also ich würd's so machen, bin aber nicht so vertraut mit grep und map die in irgendeiner Kombination sicher auch funktionieren:

                Na klar tun sie das:

                use Data::Dumper;
                use strict;
                use warnings;

                my @AoA = (
                        [ 0, 0, 0 ],
                        [ 215, 2, 1234 ],
                        [ 0, 5, 10 ],
                        [ 0, 278, 0],
                      );

                my @NoNull= grep { scalar( grep { $_ } @$_ ) } @AoA;

                print Dumper(@NoNull);

                END
                Ergebnis
                $VAR1 = [
                          [
                            215,
                            2,
                            1234
                          ],
                          [
                            0,
                            5,
                            10
                          ],
                          [
                            0,
                            278,
                            0
                          ]
                        ];

                
                >   
                > Hausaufgabe: Erkläre die Funktionsweise des Scripts!  
                  
                Nein, Danke. Die Zeiten sind entgültig vorbei ;-)  
                Trotz allem schau ich mir die Funktionen an, um sie evtl. zukünftig zu verwenden. Dumm ist nur, wenns grep und map in anderen Sprachen nicht gibt. Dann muss man wieder umdenken und sich das so wie Struppi hinbiegen. Aber sei's drumm. Haben wir mal wieder was dazu gelernt ;-)  
                  
                
                > > > Ich mal Tortendiagramme mit Chart::Pie. Mit was sonst? Man soll sich doch das Leben nicht schwerer machen als es ist, oder!?  
                > >   
                > > Schon klar, aber du kannst natürlich nicht damit rechnen, dass jeder jedes CPAN Modul kennt, ich hatte noch nie mit Diagrammen und Perl zu tun.  
                >   
                > Ganz genau! Mal abgesehen davon:  
                > 1. Nicht jeder erstellt überhaupt Diagramme mit Perl  
                  
                Richtig!  
                  
                
                > 2. Eventuell erstellen wir sie mit einem anderen Modul  
                  
                Richtig!  
                  
                
                > 3. Wie soll man zu einem Modul was sagen, wenn Du (also der OP) es nichtmal nennt...  
                  
                Hielt ich nicht für notwendig zum Lösen des Problems. Das erstellte Array @AoA ist vorab erstmal unabhängig davon, obs für ein Diagramm verwendet wird oder nicht. Ich hatte es nur erwähnt, warum ich denn die Arrays in dem Array, die komplett aus Nullen bestehen raus haben will, um das Verständnis für die Angelegenheit an sich zu verbessern.  
                  
                
                > Naja... "Schwamm drüber" wie Mr. Fish immer zu sagen pflegte...  
                  
                Genau!  
                  
                Gruß,  
                Leeloo
                
                -- 
                "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
                
              3. Ich bin ehrlich beeindruckt, deshalb klebe ich deinem Posting auch ohne Erläuterungen ein "hilfreich" auf :)

                Siechfred

                --
                Ich bin strenggenommen auch nur interessierter Laie. (molily)
                1. Moin!

                  Ich bin ehrlich beeindruckt, deshalb klebe ich deinem Posting auch ohne Erläuterungen ein "hilfreich" auf :)

                  DANKESCHÖN! Das freut mich ganz ehrlich!

                  -- Skeeve