mysteriöses warning, warum?
alex_
- perl
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?
__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.
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
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.
你好 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";
再见,
克里斯蒂安
你好 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 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.
你好 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.
再见,
克里斯蒂安