roger: länge eines mehrdimensionalen Array auselesen

Hallo,

ich habe ein Array "zeile[x][y]" (x=Zeilennummer y=Wortnummer)
Nun möchte ich alle Worte einzeln auslesen. Hierzu
schreibe ich folgenden Code für das erste Array

$i=0;

foreach(@zeile)
{
    print $zeile[$i][0];   # Das wären dann Zeile 1 bis x
    usw.
$i++;

soweit "OK"

Wie kann ich aber in dieser Schleife alle Worte auslesen, ohne das ich weiß wieviel Worte es sind.

z.B.

for ($y=0; $< $name[$i]??; $y++)

Eine foreach Schleife wäre besser aber ich weiß nicht wie ich das 2. Array (Worte) abfrage.

Gruß
         roger

  1. so würd ich das machen:

    for my @z ( @zeile ) {

    for my $wort( @z ) {
       }
    }

    grüße
    schnix

    Hallo,

    ich habe ein Array "zeile[x][y]" (x=Zeilennummer y=Wortnummer)
    Nun möchte ich alle Worte einzeln auslesen. Hierzu
    schreibe ich folgenden Code für das erste Array

    $i=0;

    foreach(@zeile)
    {
        print $zeile[$i][0];   # Das wären dann Zeile 1 bis x
        usw.
    $i++;

    soweit "OK"

    Wie kann ich aber in dieser Schleife alle Worte auslesen, ohne das ich weiß wieviel Worte es sind.

    z.B.

    for ($y=0; $< $name[$i]??; $y++)

    Eine foreach Schleife wäre besser aber ich weiß nicht wie ich das 2. Array (Worte) abfrage.

    Gruß
             roger

    1. so würd ich das machen:

      for my @z ( @zeile ) {

      for my $wort( @z ) {
         }
      }

      und mal ausprobiert?

      es gibt keine zweidimensonalen arrays in Perl , was roger sucht perldoc perllol

      Struppi.

      1. Hallo

        was roger sucht perldoc perllol

        leider aber ohne folgendes konkretes Beispiel:

          
          
        # assign to our array, an array of array references  
        my @AoA = (  
            [ "fred", "barney" ],  
            [ "george", "jane", "elroy" ],  
            [ "homer", "marge", "bart" ],  
            );  
          
          
        for my $i ( @AoA ) {  
         for my $j ( @$i ) {  
          print $j,"\t";  
         }  
         print "\n";  
        }  
          
          
          
        # assign a reference to array of array references  
        my  $AoA_ref = [  
         [ "fred", "barney", "pebbles", "bambam", "dino", ],  
         [ "homer", "bart", "marge", "maggie", ],  
         [ "george", "jane", "elroy", "judy", ],  
            ];  
          
          
        for my $i ( @$AoA_ref ) {  
         for my $j ( @$i ) {  
          print $j,"\t";  
         }  
         print "\n";  
        }  
        
        

        Im übrigen bin ich der Meinung [1] dass man Perlanfängern in Tutorials erst das dereferenzieren beibringen sollte d.h. @$A_ref  , bevor sie lernen dass man auch  @A schreiben kann.

        Gruß
          LanX

        [1] Wie sagt man "Cheatah bitte übersetzen sie..." auf Latein ???

        1. Hallo
          sieht doch gut aus.

          assign a reference to array of array references

          my  $AoA_ref = [
          [ "fred", "barney", "pebbles", "bambam", "dino", ],
          [ "homer", "bart", "marge", "maggie", ],
          [ "george", "jane", "elroy", "judy", ],
              ];

          for my $i ( @$AoA_ref ) {
          for my $j ( @$i ) {
            print $j,"\t";
          }
          print "\n";
          }

          Wie sieht es aus wenn die die Anzahl der Felder im 2. Array haben will ?
          Anzahl der Felder im @$i ?

          Gruß
                    roger

          1. Hi

            Wie sieht es aus wenn die die Anzahl der Felder im 2. Array haben will ?
            Anzahl der Felder im @$i ?

            du musst ein Array im scalaren Kontext auswerten:

            $anz=@$i

            Eventuell musst du es mit "scalar" erzwingen, z.B. bei print:

              
            my  $AoA_ref = [  
             [ "fred", "barney", "pebbles", "bambam", "dino", ],  
             [ "homer", "bart", "marge", "maggie", ],  
             [ "george", "jane", "elroy", "judy", ],  
                ];  
              
              
            for my $i ( @$AoA_ref ) {  
             for my $j ( @$i ) {  
              print $j,"\t";  
             }  
             print "\t Anz:".scalar @$i."\n";  
            }  
            
            

            grüße
             LanX

            1. Hello again,

              Wie sieht es aus wenn die die Anzahl der Felder im 2. Array haben will ?
              Anzahl der Felder im @$i ?

              Ich vermute allerdings du suchst nicht die Anzahl sondern den um eins kleineren letzten Index:

                
              $max=$#{$i}; #enstpricht @$i-1  
                
              for my $i ( @$AoA_ref ) {  
               for my $j ( 0  .. $#{$i} ) {  
                print @$i[$j],"\t";  
               }  
               print "\t $#{$i}  $#$i \n";  
              }  
              
              

              ABER, den Index braucht man eher selten, schließlich ist die Laufvariable in "foreach" resp. "for" einen ALIAS aufs Arrayelement!!!

              d.h.

                
              for my $i ( @$AoA_ref ) {  
               push @$i , "steffen";  
              }  
                
              for my $i ( @$AoA_ref ) {  
               for my $j ( @$i ) {  
                print $j,"\t";  
               }  
              }  
              
              

              grüße
                LanX

              PS: Hat das Forum schon immer Tab-indentation in Sourcen geschluckt?

              1. Hi

                for my $j ( 0  .. $#{$i} ) {

                Habe $#{$ref} nie gemocht, statt dessen lieber ( 0 .. @$ref-1 ).

                BTW: $i finde ich je eher ungünstige Namenswahl für ein Array...

                MfG
                 Kurt

                PS: in irgendeiner Sprache konnte man doch auch "..." für ein offenes Interval schreiben, oder?

          2. Hallo roger!

            assign a reference to array of array references

            my  $AoA_ref = [
            [ "fred", "barney", "pebbles", "bambam", "dino", ],
            [ "homer", "bart", "marge", "maggie", ],
            [ "george", "jane", "elroy", "judy", ],
                ];

            for my $i ( @$AoA_ref ) {
            for my $j ( @$i ) {
              print $j,"\t";
            }
            print "\n";
            }

            Wie sieht es aus wenn die die Anzahl der Felder im 2. Array haben will ?
            Anzahl der Felder im @$i ?

            Der (oder das?) zweite Array hat den Index 1. Denn erreichst Du also mit $$AoA_ref[1]. Aber wir sind hier noch nicht fertig, denn:

              
            print @$AoA_ref[1]; # Ausgabe -> ARRAY(0x18313b8)
            

            Huch? Hier muss also auch dereferenziert werden!

              
            my $arr = @$AoA_ref[1]};  
            my @arr = @$arr;  
            print scalar @arr; # Ausgabe -> 4
            

            Kürzer:

              
            my $arr = @{@$AoA_ref[1]};  
            print $arr;        # Ausgabe -> 4
            

            Viele Grüße aus Frankfurt/Main,
            Patrick

            --

            _ - jenseits vom delirium - _
            [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
            Nichts ist unmöglich? Doch!
            Heute schon gegökt?
            1. Wie sieht es aus wenn die die Anzahl der Felder im 2. Array haben will ?
              Anzahl der Felder im @$i ?

              scalar @$i;

              Der (oder das?) zweite Array hat den Index 1. Denn erreichst Du also mit $$AoA_ref[1]. Aber wir sind hier noch nicht fertig, denn:

              Das ist nicht schön mit den doppelten Dollarzeichen.
              Perl kann das so wie in anderen Sprachen auch mit dem Pfeil: $AoA_ref->[1].

              Struppi.

              1. Hallo Struppi!

                Das ist nicht schön mit den doppelten Dollarzeichen.

                Das war ein Vertipper. Ich wollte »@$« schreiben. Aber mit dem Doppel$ sieht das nach Raffgier und $teuerhinterziehung aus und ist somit hoch aktuell ;)

                Viele Grüße aus Frankfurt/Main,
                Patrick

                --

                _ - jenseits vom delirium - _
                [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                Nichts ist unmöglich? Doch!
                Heute schon gegökt?
                1. Das ist nicht schön mit den doppelten Dollarzeichen.

                  Das war ein Vertipper. Ich wollte »@$« schreiben. Aber mit dem Doppel$ sieht das nach Raffgier und $teuerhinterziehung aus und ist somit hoch aktuell ;)

                  oops, stimmt

                  Struppi.

              2. Hallo Struppi!

                Perl kann das so wie in anderen Sprachen auch mit dem Pfeil: $AoA_ref->[1].

                Was ist übersichtlicher:

                  
                  print $FILES{B_level1_00}{SECTIONS}[1]{SECTIONS}[0]{SECTIONS}[0]{FILE_URL}; 
                

                oder:

                  
                  print $FILES{B_level1_00}->{SECTIONS}->[1]->{SECTIONS}->[0]->{SECTIONS}->[0]->{FILE_URL}; 
                

                Ausgabe anhand eines Hashs %FILES, der eine Web-Struktur enthält, ist:

                /level1/level2/level3/level4/page0.html

                Beim Letzteren komme ich mir vor wie bei den Apachen (naja, einer liefert mir ja die Seiten aus) ;)

                Viele Grüße aus Frankfurt/Main,
                Patrick

                --

                _ - jenseits vom delirium - _
                [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                Nichts ist unmöglich? Doch!
                Heute schon gegökt?
                1. Was ist übersichtlicher:

                  print $FILES{B_level1_00}{SECTIONS}[1]{SECTIONS}[0]{SECTIONS}[0]{FILE_URL};

                  
                  >   
                  > oder:  
                  >   
                  > ~~~perl
                    
                  
                  >   print $FILES{B_level1_00}->{SECTIONS}->[1]->{SECTIONS}->[0]->{SECTIONS}->[0]->{FILE_URL}; 
                  
                  

                  Das zweite, eindeutig.

                  Struppi.

                  1. Hi

                    print $FILES{B_level1_00}{SECTIONS}[1]{SECTIONS}[0]{SECTIONS}[0]{FILE_URL};

                    
                    > >   
                    > > oder:  
                    > >   
                    > > ~~~perl
                      
                    
                    > >   print $FILES{B_level1_00}->{SECTIONS}->[1]->{SECTIONS}->[0]->{SECTIONS}->[0]->{FILE_URL}; 
                    
                    

                    Das zweite, eindeutig.

                    lol ... schlechtes Beispiel Patrick ... in der Kürze läg die Würze :)

                    mein Vorschlag:

                      
                    print $FILES {B_level1_00} {SECTIONS} [1] {SECTIONS} [0] {SECTIONS} [0] {FILE_URL};  
                    
                    

                    KurtZ

                    1. Hallo Kurt!

                      lol ... schlechtes Beispiel Patrick ... in der Kürze läg die Würze :)

                      Wie meinen? Ob es unklug ist, eine so tief verschachtelte Webstruktur zu haben, oder es unklug ist, einen solchen Hash zu haben? Oder meinst Du die Länge des Beispiels an sich? Das Beispiel sollte nur ein Beispiel für die für mich unübersichtlichen Pfeile sein, an die Subsections von den Subsections der verschachtelten Struktur komme ich anderswie heran :)

                      print $FILES {B_level1_00} {SECTIONS} [1] {SECTIONS} [0] {SECTIONS} [0] {FILE_URL};

                        
                      Da bleibe ich lieber bei meiner leerzeichenfreien Version, da ich die Pfeile eher für sowas einsetze:  
                        
                        `my %FILES = %{$obj->parseDataFile};`{:.language-perl}  
                        
                        
                        
                      Viele Grüße aus Frankfurt/Main,  
                      Patrick
                      
                      -- 
                      ![](http://www.atomic-eggs.com/fuernA.jpg)  
                        
                      \_ - jenseits vom delirium - \_  
                        
                      [[link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash](http://www.atomic-eggs.com/)]  
                      Nichts ist unmöglich? [Doch!](http://www.atomic-eggs.com/cwi/cwi_4.shtml)  
                      Heute schon ge[gök](http://goek.atomic-eggs.com/goek_goek.html)t?
                      
                      1. Hallo Patrick!

                        lol ... schlechtes Beispiel Patrick ... in der Kürze läg die Würze :)

                        Wie meinen?

                        [code lang=perl]
                        $a[1]{bubu}        ;# praktischer
                        $a->[1]->{bubu}    ;# übersichtlicher
                        [code]

                        Wenn ich Pfeile sehe muss ich auch erst an Objekte denken.

                        MfG
                         Kurt

                        1. [code lang=perl]
                          $a[1]{bubu}        ;# praktischer
                          $a->[1]->{bubu}    ;# übersichtlicher
                          [code]

                          Wenn ich Pfeile sehe muss ich auch erst an Objekte denken.

                          Hmm, ich an Referenzen. Ist das nicht auch in C/C++ so?

                          Struppi.

                          1. $a[1]{bubu}        ;# praktischer
                            $a->[1]->{bubu}    ;# übersichtlicher

                            
                            > >   
                            > Hmm, ich an Referenzen. Ist das nicht auch in C/C++ so?  
                              
                            kann sein, ist das ein argument?  
                              
                            gibs zu, du schreibst doch auch nicht:  
                              
                            ~~~perl
                              
                             $a->[1]->{bubu}->{pepe}  ;  
                            #sondern  
                             $a->[1]{bubu}{pepe}  
                            
                            

                            Aber tröste dich, deine Schreibweise ist die von Conway favorisierte, inklusive einem angehängten "_ref" als Variablenkonvention.

                            Ich frage mich nur gerade. obs nicht umgekehrt viel einsichtiger wäre, man deklariert direkt Refs
                            $zahlen=[1,2,3]
                            und macht die Listenform zur Ausnahme, wo man etwas anhängt
                            @zahlen_lst=(1,2,3)

                            das kostet mich im allgemeinen nur ein Sigil mehr, und erschlägt viele Probleme bei Variablenübergaben oder verschachtelten Strukturen auf konsistente Art und Weise.

                            An die Notation gewöhnt man sich, ich hab mal einieg Schreibweisen hier aufgelistet
                            [link=http://board.perl-community.de/thread/11304/startWithMessage=14]

                            Kann man mir folgen?
                             Kurt

                            1. Hmm, ich an Referenzen. Ist das nicht auch in C/C++ so?

                              kann sein, ist das ein argument?

                              gibs zu, du schreibst doch auch nicht:

                              $a->[1]->{bubu}->{pepe}  ;

                              Doch.

                              #sondern
                              $a->[1]{bubu}{pepe}

                              Nein, dieses Schreiweise benutze ich nie, das gefällt mir nicht und ich find sie unübersichtlicher.

                              Aber tröste dich, deine Schreibweise ist die von Conway favorisierte, inklusive einem angehängten "_ref" als Variablenkonvention.

                              Wußte ich nicht - aber, siehste ;-)

                              Ich frage mich nur gerade. obs nicht umgekehrt viel einsichtiger wäre, man deklariert direkt Refs
                              $zahlen=[1,2,3]
                              und macht die Listenform zur Ausnahme, wo man etwas anhängt
                              @zahlen_lst=(1,2,3)

                              das kostet mich im allgemeinen nur ein Sigil mehr, und erschlägt viele Probleme bei Variablenübergaben oder verschachtelten Strukturen auf konsistente Art und Weise.

                              So sieht's aus, ich benutze eigentlich auch fast nur Referenzen.

                              An die Notation gewöhnt man sich, ich hab mal einieg Schreibweisen hier aufgelistet
                              [link=http://board.perl-community.de/thread/11304/startWithMessage=14]

                              Kann man mir folgen?

                              Ja, wieso nicht.

                              Struppi.

                        2. Hallo Kurt!

                          $a[1]{bubu}        ;# praktischer

                          ^^^^

                          Hihi... ich benutze solche bubus und bobos und babas auch, wenn ich die Übersicht verloren habe, und ich wissen will, was nun wo passiert:

                          print "BUBU: ", $irgendwas;
                          print "BOBO: ", $nochwas;

                          Und wenn ich nach dran, meine Tasse Tee gen Monitor zu schleudern, schreibe ich:

                          print "MERDE: ", $nervnet;

                          ;)

                          Viele Grüße aus Frankfurt/Main,
                          Patrick

                          --

                          _ - jenseits vom delirium - _
                          [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                          Nichts ist unmöglich? Doch!
                          Heute schon gegökt?
              3. Hi

                Das ist nicht schön mit den doppelten Dollarzeichen.

                Geschmackssache, es ist wenigstens Orthogonal, (aber zugegeben nicht üblich).

                Man könnte sich  -> nur für Objekte reservieren.

                Perl kann das so wie in anderen Sprachen auch mit dem Pfeil: $AoA_ref->[1].

                Und ich dachte die typische andere Sprachen benutzt einen Punkt.

                Das Beispiel von Lanx ist recht knackig, ich frage mich obs vielleicht nicht besser wäre defaultmäßig mit Refs zu arbeiten, syntaktisch wär das nur ein Sigil mehr, dafür sind verschachtelte Strukturen dann kein Thema mehr.

                Bye
                 Kurt