alex_: mysteriöses warning, warum?

hiho, ich habe hier ein warning von einer zeile, das ich nicht erklären kann:

__CODE__
foreach my $key (keys %{$Obj_Data}) {

next if ( $$Obj_Data{$key} eq "" );

..some functions...
}
__CODE__

nun meckert perl: "Use of uninitialized value in string eq ..." in genau der zeile von dem next.

wieso?
ich will doch nur leere strings filtern, wie soll ich das sonst machen. komischerweise produziert !$$Obj_Data{$key} kein warning, das fängt mir aber 0-Werte ab, was ich nicht will...

hat jemand ne ahnung?

  1. __CODE__
    foreach my $key (keys %{$Obj_Data}) {

    next if ( $$Obj_Data{$key} eq "" );

    Ich persönlich finde es so klarer $Obj_Data->{$key}?

    ..some functions...
    }
    __CODE__

    nun meckert perl: "Use of uninitialized value in string eq ..." in genau der zeile von dem next.

    Wenn der Wert undefiniert sein kann, solltest du ihn nicht mit einem Leerstring vergleichen.

    wieso?
    ich will doch nur leere strings filtern, wie soll ich das sonst machen. komischerweise produziert !$$Obj_Data{$key} kein warning, das fängt mir aber 0-Werte ab, was ich nicht will...

    Du suchst wahrscheinlich:

    next unless defined $Obj_Data->{$key};

    Struppi.

    1. next unless defined $Obj_Data->{$key};

      jo, funzt. ich war bisher immer der überzeugung, daß ein hash keine undefinierten werte hat, falls der schlüssel existiert... aber man lernt immer dazu.

      thx, für die schnelle antwort
      alex

      1. next unless defined $Obj_Data->{$key};

        jo, funzt. ich war bisher immer der überzeugung, daß ein hash keine undefinierten werte hat, falls der schlüssel existiert... aber man lernt immer dazu.

        Nein und noch schlimmer -> autovivikation.

        So wie du es bisher gemacht hast erzeugst du automatisch neue Schlüssel was u.U. andere Probleme hervorruft.

        Es gibt 3. Möglichkeiten:

        if $hash{key} -> prüft aud 0, '' und undef erzeugt einen neuen Schlüssel wenn dieser nicht existiert

        if defined $hash{key} prüft ob der Wert ungleich undef ist (d.h. 0 und '' ist wahr nur undef ist unwahr), erzeugt keinen Schlüssel

        if exist $hash{key} prüft ob der Schlüssel existiert, erzeugt keinen Schlüssel

        Struppi.

        1. 你好 Struppi,

          So wie du es bisher gemacht hast erzeugst du automatisch neue Schlüssel
          was u.U. andere Probleme hervorruft.

          Ich gehe mal davon aus, dass du meinst, es werden neue Einträge in der
          Tabelle hinzugefügt. Und das ist falsch. Neue Einträge werden nur durch
          eine Wertzuweisung erstellt.

          if $hash{key} -> prüft aud 0, '' und undef erzeugt einen neuen Schlüssel
          wenn dieser nicht existiert

          Falsch, siehe oben.

          if defined $hash{key} prüft ob der Wert ungleich undef ist (d.h. 0 und
          '' ist wahr nur undef ist unwahr), erzeugt keinen Schlüssel

          Richtig.

          if exist $hash{key} prüft ob der Schlüssel existiert, erzeugt keinen
          Schlüssel

          Richtig.

          Prüfen kannst du das auch ganz leicht:

            
          #!/usr/bin/perl -w  
            
          use strict;  
            
          my %hash = ();  
            
          if($hash{test}) {  
            # nothing  
          }  
            
          if($hash{test} eq "") {  
            # nothing  
          }  
            
          if(defined $hash{test}) {  
            # nothing  
          }  
            
          if(exists $hash{test}) {  
            # nothing  
          }  
            
          print join(',',keys %hash),"\n";  
          
          

          再见,
          克里斯蒂安

          --
          <g[oma]> peter lustig ist auf jeden fall besser als peter huth, obwohl der auch lustig ist.
          1. 你好 Christian,

            So wie du es bisher gemacht hast erzeugst du automatisch neue Schlüssel
            was u.U. andere Probleme hervorruft.

            Vergessen: der uninitialized value passiert deshalb, weil entweder der Wert
            des Eintrags tatsächlich undef ist oder der Eintrag nicht existiert. Wenn
            ein Eintrag zu einem Key in der Hash-Tabelle nicht existiert, wird naemlich
            undef zurueckgegeben.

            再见,
            克里斯蒂安

            --
            So, wie ein Teil ist, ist das Ganze.
          2. So wie du es bisher gemacht hast erzeugst du automatisch neue Schlüssel
            was u.U. andere Probleme hervorruft.

            Ich gehe mal davon aus, dass du meinst, es werden neue Einträge in der
            Tabelle hinzugefügt. Und das ist falsch. Neue Einträge werden nur durch
            eine Wertzuweisung erstellt.

            Ahhh, ich hatte die autovivikation falsch verstanden uind ist in dem Falle auch nicht relevant.

            #!/usr/bin/perl -w

            use strict;

            my %hash = ();

            if($hash{test}->{test}) {
              # nothing
            }
            print join(',',keys %hash),"\n";

            Struppi.

            1. 你好 Struppi,

              #!/usr/bin/perl -w

              use strict;

              my %hash = ();

              if($hash{test}->{test}) {
                # nothing
              }
              print join(',',keys %hash),"\n";

              Jupp -- in dem Fall wird implizit ein Eintrag erstellt, um auf ->{test}
              zugreifen zu können.

              再见,
              克里斯蒂安

              --
              Das Leben ist wie ein Kartenspiel: was dir gegeben wurde, ist vorbestimmt. Doch wie du damit spielst, ist deine Entscheidung.