Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8262[/thread]

Wunderbare Selbsterzeugung bei Hashüberprüfung?



<< >> 3 Einträge, 1 Seite
toby
 2006-08-24 00:19
#69162 #69162
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Hallo Community :)

in einem grösseren Program muss ich testen, ob ein bestimmter Key eines Hash in Hash definiert ist. Es kann vorkommen, dass der Hash in Hash selbst nicht vorhanden ist. Meine Prozedur sieht ähnlich aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl

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

my $A = 'KEY';

my $href={
#HASH => { $A => 1}
};

if (defined($href->{HASH}->{$A}) ){
print "definiert\n"
}else{
print "nicht definiert\n"
}

print Dumper($href);


Solange HASH->{KEY} existiert ist alles OK, if liefert "definiert" und Dumper gibt alles richtig aus. Sobald aber HASH->{KEY} nicht existiert, liefert if zwar "nicht definiert", allerdings wird bei der Überprüfung ein leeres HASH angelegt. Der Dumper sagt:

Quote
not defined
$VAR1 = {
'HASH' => {}
};


Und das ist ein grosser, in meinem Fall soger ein sehr grosser Mist, weil da auf einmal ein leeres HASH existiert und bringt die weitere Verarbeitung aus dem Tritt... Ich könnte hier zwar im Zweierschritt erst testen, ob HASH existiert und erst dann auf HASH->{KEY} testen. Es wird aber in 99,9% vorkommen, dass HASH->{WAS_ANDERES} schon vorhanden ist dann wäre diese Überprüfung zimlich sinnlos und verschwenderisch und ich müsste immer zwei Schritte machen um eine Stufe zu erreichen. Das ist bischen doof und ich kann mir nicht vorstellen, dass Perl zu sowas zwingen würde, oder muss ich mich hier beugen?

Deswegen meine Frage: Warum kommt es zu dieser Selbsterzeugung und wie kann ich es verhindern, wenn ich unbedingt die drunterlegende Struktur eines Hash im Hash überprüfen muss?

Wer hat eine Antwort auf diese Fragen?
Danke
Tobias
renee
 2006-08-24 00:36
#69163 #69163
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das nennt sich autovivification. Du solltest Deine Abfrage eher so machen:
Code: (dl )
1
2
3
4
5
6
7
if (exists $href->{HASH} and 
exists $href->{HASH}->{$A} and
defined($href->{HASH}->{$A}) ){
print "definiert\n"
}else{
print "nicht definiert\n"
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
toby
 2006-08-24 00:46
#69164 #69164
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Hi renee,

> Das nennt sich autovivification.

oh man.. jetzt wo Du es sagst, hat es bei mir geklingelt.. ich habe darüber schon im Alpakabuch gelesen.. danke! :)

Tobias
<< >> 3 Einträge, 1 Seite



View all threads created 2006-08-24 00:19.