Referenz in einem Hash dereferenzieren
|
Seitenanfang |
| Halli Hallo! Ich habe folgendes Konstrukt:
my %namen; my $name="Hans"; $namen{'vorname'}=\$name;
Jetzt möchte ich anzeigen lassen was ursprünglich in $namen{'vorname'} steht. Kurz gesagt: "Hans" soll die Ausgabe sein. print ${$namen{'vorname'}};
geht leider nicht. strict streikt da.Kann mir jemand bei dieser Derferenzierung helfen? Ich bin schon lange am suchen aber offenbar zu blöd, das zu checken :-( mfg, speed
Datum: 27.03.2007-12:46

|
re: Referenz in einem Hash dereferenzieren
|
Seitenanfang |
my $printname=$namen{'vorname'}; print $$printname;
funktioniert, aber kann man das ohne die Zwischenvariable $printname schreiben?
Datum: 27.03.2007-13:02

|
re: Referenz in einem Hash dereferenzieren
|
Seitenanfang |
Die Variante
print ${$namen{'vorname'}};
funktioniert auch unter strict. Welche Fehlermeldung erhälst du denn?
Datum: 27.03.2007-14:40

|
re: Referenz in einem Hash dereferenzieren
|
Seitenanfang |
| Habe den Fehler gefunden. Der Hash %namen ist bei print ${$namen{'vorname'}}; zwar definiert nur gibt es keinen Schlüssen 'vorname' und somit auch keine Referenz im Wert des Hashes. Der Hash wird beim Aufruf einer anderen Subroutine mit Schlüsseln und Werten (Referenzen) gefüllt. Am Ende dieser Sub wird die ursprüngliche Sub aufgerufen. Dann kann nämlich dereferenziert werden. Mein fehlerhafter Code im Schema:
my %error; my $errorcode = '<font color=#FF0000>';if ($action eq "daten"){&daten;) elsif ($action eq "daten_save"){&daten_save;) else{&daten;} sub daten { print ${$error{'vorname'}}; print "Vorname<br><input type=\"text\" name=\"vorname\">"; # Mit submit werden die Daten an daten_save übergeben } sub daten_save { if (!$query{'vorname'}) { $error{'vorname'}=\$errorcode; &daten; } else { #Daten speichern } }
Der Hash hat einfach die Funktion, den Titel des Eingabefeldes "Vorname" rot zu machen. Habs jetzt mit einfachen Hashes gelöst. Die Variable wird nun nur mehr in den Hash-Wert kopiert. Zwar nicht die eleganteste Lösung aber was schöneres fällt mir nicht ein ;-)mfg
Datum: 27.03.2007-15:30

|
re: Referenz in einem Hash dereferenzieren
|
Seitenanfang |
Am besten prüft man zuvor ob die Variable definiert ist if(defined($error{'vorname'})) { # ... mach was wenn $error{'vorname'} definiert ist print ${$error{'vorname'}}, "\n"; } else { # ... mach was wenn $error{'vorname'} _nicht_ definiert ist }
Datum: 28.03.2007-00:39

|