Stella: Array durchlaufen

Hi!

ich habe folgendes Konstrukt (verkürzt)

my $test = (  
    a => {  
        b => ['c', 'd', 'e', 'f', 'g']  
    }  
);  
foreach ($test{a}{b}){  
    print "$_ \n";  
}

als Ausgabe erhalte ich nur "ARRAY(0x8478994)".

Wo ist mein Denkfehler?
perlref habe ich versucht zu verstehen - scheint aber leider nivht geklappt zu haben :-{

Stella

  1. ich habe folgendes Konstrukt (verkürzt)

    my $test = (

    a => {
            b => ['c', 'd', 'e', 'f', 'g']
        }
    );

    Das ist Murks. Wenn du ein Array einem Skalar zuweist, ist das Ergebnis das letzte Element:

    [code lang=perl]my $tmp = ('c', 'd', 'e', 'f', 'g');
    print  $tmp;

      
    Du willst eine Hashreferenz zuweisen.  
    ~~~perl
    my $test = {  
         a => {  
             b => ['c', 'd', 'e', 'f', 'g']  
         }  
    };  
    
    

    Und um die Liste auszugeben musst du das Element dereferenzieren:

    foreach( @{$test->{a}->{b}}{  
    print "$_\n";  
    }  
    
    

    Struppi.

    1. hi

      Du willst eine Hashreferenz zuweisen.

      my $test = {

      a => {
               b => ['c', 'd', 'e', 'f', 'g']
           }
      };

      
      >   
      > Und um die Liste auszugeben musst du das Element dereferenzieren:  
      > ~~~perl
      
      foreach( @{$test->{a}->{b}}{  
      
      > print "$_\n";  
      > }  
      > 
      
      

      danke!
      wieder etwas dazugelernt :-)

      Stella

    2. Hi

      Das ist Murks. Wenn du ein Array einem Skalar zuweist, ist das Ergebnis das letzte Element:

      ähm ...ich dachte wenn man ein Array einem Scalar zuweist bekommt man die Länge des Arrays!

      und tatsächlich tut sich hier wohl der Unterschied zwischen Liste und Array auf:

        
      my @tmp = ('c', 'd', 'e', 'f', 'g');  
      my $tmp= @tmp;  
      print $tmp; #Ausgabe 5  
      
      

      Perl ...fremd und geheimnisvoll ...

      Guten rutsch
       Kurt

      1. http://search.cpan.org/~rgarcia/perl-5.10.0/pod/perlfaq4.pod#What_is_the_difference_between_a_list_and_an_array?

        weiß jmd wann man den "scalar comma operator" sinnvoll braucht?

        Grüße
         Kurt

        1. http://search.cpan.org/~rgarcia/perl-5.10.0/pod/perlfaq4.pod#What_is_the_difference_between_a_list_and_an_array?

          Oh, da bin ich einem kleinen Irrtum aufgelegen. Das kommt davon, wenn man nicht in die FAQs schaut.

          weiß jmd wann man den "scalar comma operator" sinnvoll braucht?

          Auf die Schnelle fällt mir nichts wirklich sinnvolles ein, aber man kann so Platz sparen:

          $x = tu_was(), 'wert' if ....;

          Struppi.

          1. Hi

            Auf die Schnelle fällt mir nichts wirklich sinnvolles ein, aber man kann so Platz sparen:

            $x = tu_was(), 'wert' if ....;

            du hast recht, nicht wirklich sinnvoll! (grusel :-)

            Kurt

    3. Hi

      ein kleines Problem hätte ich aber noch

      ich möchte überprüfen, ob es ein Indes im Array gibt

      my $test = {  
           a => {  
               b => ['c', 'd', 'e', 'f', 'g']  
           }  
      };  
      print "Exists\n" if exists $test->{a}->{b}['h'];  
      print "Defined\n" if defined $test->{a}->{b}['h'];  
      print "True\n" if $test->{a}->{b}['h'];
      

      als Ergebnis erhalte ich

      Exists
      Defined
      True

      in der Doku exists@perldoc habe ich filgendesd gefunden

          print "Exists\n"    if exists $array[$index];  
          print "Defined\n"   if defined $array[$index];  
          print "True\n"      if $array[$index];
      

      Stella

      1. ich möchte überprüfen, ob es ein Indes im Array gibt

        [code lang=perl]my $test = {
             a => {
                 b => ['c', 'd', 'e', 'f', 'g']
             }
        };
        print "Exists\n" if exists $test->{a}->{b}['h'];

        'h' ist kein Index. Dazu musst du das Array durchlaufen.

        Struppi.

        1. Hi

          Dazu musst du das Array durchlaufen.

          das hab ich mir schon fast gedacht :-\

          Stella

          1. Dazu musst du das Array durchlaufen.

            das hab ich mir schon fast gedacht :-\

            Dafür gibt es aber auch ein Modul  (es gibt vielleicht sogar noch mehr, ich hab nur kurz gesucht)

            Struppi.

    4. Das ist Murks. Wenn du ein Array einem Skalar zuweist, ist das Ergebnis das letzte Element:

      my $tmp = ('c', 'd', 'e', 'f', 'g');

      print  $tmp;

        
      Sorry, aber \*das\* ist noch größerer Murks - ein Array ist nunmal keine Liste. Entweder Du verwendest eine Arrayreferenz, dann musst Du \*erst\* dereferenzieren und \*dann\* den skalaren Kontext anwenden:  
        
      ~~~perl
      my $tmp = ['c', 'd', 'e', 'f', 'g'];  
      print scalar @$tmp;
      

      Oder Du verwendest das korrekte Sigil:

      my @tmp = ('c', 'd', 'e', 'f', 'g');  
      print my $anz = @tmp;
      

      Siechfred

      --
      Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
      1. Sorry, aber *das* ist noch größerer Murks -

        Ähm, das sollte demonstrieren, was passiert und war keine Lösung

        Struppi.

        1. Sorry, aber *das* ist noch größerer Murks -
          Ähm, das sollte demonstrieren, was passiert und war keine Lösung

          Laufen sollte ein Beispielcode dennoch, und der von Dir gepostete Code produziert unter strict-Bedingungen einen Sack voll Warnungen, die einem Anfänger höchstvermutlich nicht viel sagen und statt dessen nur weitere - in diesem Fall vermeidbare - Fragen aufwerfen.

          Siechfred

          --
          Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
          1. Sorry, aber *das* ist noch größerer Murks -
            Ähm, das sollte demonstrieren, was passiert und war keine Lösung

            Laufen sollte ein Beispielcode dennoch, und der von Dir gepostete Code produziert unter strict-Bedingungen einen Sack voll Warnungen, die einem Anfänger höchstvermutlich nicht viel sagen und statt dessen nur weitere - in diesem Fall vermeidbare - Fragen aufwerfen.

            Ist ja ok, das war ein Schnellschuß um zu demonstrieren was wirklich passiert,  dass die Zuweisung auch noch Warnungen erzeugt, umso besser, damit sieht der Anfänger, das dieser Ansatz Murks ist.

            Letztlich hat der Orginalcode ja schon die Warnungen erzeugt, ich hab diesen Ansatz verwendet ohne zu testen, da ja auch nichts von diesen Warnungen erwähnt wurde, lediglich um zu zeigen dass dieser Murks ist, wie du ja bestätigt hast.

            Struppi.

            1. Hi

              Ist ja ok, das war ein Schnellschuß um zu demonstrieren was wirklich passiert,  dass die Zuweisung auch noch Warnungen erzeugt, umso besser, damit sieht der Anfänger, das dieser Ansatz Murks ist.

              Letztlich hat der Orginalcode ja schon die Warnungen erzeugt, ich hab diesen Ansatz verwendet ohne zu testen, da ja auch nichts von diesen Warnungen erwähnt wurde, lediglich um zu zeigen dass dieser Murks ist, wie du ja bestätigt hast.

              mein Code hatte keine Warnungen etc. erzeugt

              am Anfang der Datei stand
              {code lang=perl]use warnings;
              use strict;[/code]

              Stella

              1. mein Code hatte keine Warnungen etc. erzeugt

                Bei mir schon.

                Struppi.

          2. Hi Siechfred,

            Sorry, aber *das* ist noch größerer Murks -
            Ähm, das sollte demonstrieren, was passiert und war keine Lösung

            Laufen sollte ein Beispielcode dennoch, und der von Dir gepostete Code produziert unter strict-Bedingungen einen Sack voll Warnungen, die einem Anfänger höchstvermutlich nicht viel sagen und statt dessen nur weitere - in diesem Fall vermeidbare - Fragen aufwerfen.

            ich finde deine harsche Kritik weder fair noch angebracht.

            1. Struppi wollte eindeutig zeigen wie's nicht geht,
            2. nicht lauffähigen Code hast du auch schon zu genüge gepostet
            3. Ich denke 4x "Useless use of a constant ..." dürften in einem Beispielcode über Listen erlaubt sein.

            Rechthaberisch ins neue Jahr gestartet???

            Frohes neues
             Kurt

              1. Struppi wollte eindeutig zeigen wie's nicht geht,

              Sein Posting liest sich anders, finde ich.

              1. nicht lauffähigen Code hast du auch schon zu genüge gepostet

              Das will ich gar nicht abstreiten, er ist auch entsprechend korrigiert worden.

              1. Ich denke 4x "Useless use of a constant ..." dürften in einem Beispielcode über Listen erlaubt sein.

              Für Dich und für Struppi vielleicht, aber für einen Anfänger, der das Beispiel nachvollziehen will, m.E. nicht.

              Rechthaberisch ins neue Jahr gestartet???

              No comment.

              Siechfred

              --
              Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
              1. Lieber Siechfred,

                der "Murks" liegt bei Perl5, wie du aus dem Durcheinander einen idealen anfängergerechten Postingstil ableiten willst, ist mir schleierhaft.

                Die Leute die trotzdem versuchen sich der Wahrheit anzunähern (und anderen zu helfen) unnötig anzumurksen ist IMHO kontraproduktiv.

                Moderator ist ehrlich der letzte Job auf der Welt den ich haben wollte, wenn man soviele Postings lesen muss und sich auch noch verpflichtet fühlt einen Standard hochzuhalten, unterlaufen einem schonmal Schnellschüsse...

                Wie auch immer einen schönen Abend noch.
                 Kurt