Verständnisproblem mit Referenz auf Hash

10/12/2012 - 10:18 von Joerg Weilbier | Report spam
Hallo!

Irgendwie verstehe ich das mit den Referenzen auf Hashes nicht, bzw.
kann die Beispiele aus <http://perldoc.perl.org/perlref.html> an
meinem Code nicht nachvollziehen.

Eine "normale" de-Referenzierung einer Hashreferenz verhàlt sich bei
mir nicht wie ein Hash, sondern selbst wieder wie eine Referenz.

Debugger-Ausgabe:

DB<2> x $refCurrentSide
0 REF(0x203d2ef0)
-> HASH(0x203d2f20)
'Name' => 'primaer'
'Par' => HASH(0x203d2f68)
'Null' => 'e'
'Sg' => 0
...
ok, $refCurrentSide _ist_ eine Referenz auf einen Hash.

DB<3> x ${$refCurrentSide}
0 HASH(0x203d2f20)
'Name' => 'primaer'
'Par' => HASH(0x203d2f68)
'Null' => 'e'
'Sg' => 0
...
Auch das scheint mir noch klar, die de-Referenzierung von
$refCurrentSide zeigt einen Hash.

Aber jetzt:

DB<4> x ${$refCurrentSide}{"Name"}
Not a HASH reference at (eval 9)[/usr/lib/perl5/5.14/perl5db.pl:640] line 2, <$fh_infile> line 270.

Das entspricht doch eigentlich genau den Beispielen in
<http://perldoc.perl.org/perlref.html>, "Using References",
Abschnitt "2.", Codebeispielzeile 4 - die ich zumindest nach
intensivem Lesen einigermaßen logisch finde.

Komischerweise funktioniert aber folgendes:
DB<5> x ${$refCurrentSide}->{"Name"}
0 'primaer'

Das entspricht aus meiner Sicht aber einer zweifachen de-Referenzierung
von $refCurrentSide, die hier eigentlich auch falsch sein müsste.
Ausserdem zeigt ja auch obige Debug-Ausgabe DB<3>, dass die einfache
de-Referenzierung erfolgreich war.

Kann mir jemand meine Perl-Welt zurechtrücken??


Joerg
 

Lesen sie die antworten

#1 Joerg Weilbier
10/12/2012 - 13:55 | Warnen spam
Lieber Jörg!
Da muss ich mir glatt selbst antworten (was ein Spaziergang in
der Mittagspause so ausmacht):

Am 10.12.2012 10:18, Joerg Weilbier wrote:
Irgendwie verstehe ich das mit den Referenzen auf Hashes nicht, bzw.
kann die Beispiele aus <http://perldoc.perl.org/perlref.html> an
meinem Code nicht nachvollziehen.


jetzt schon.

Meine Blindheit lag darin, dass in einer Hashes of Hashes - Tabelle
die _Values_ der übergeordneten Tabelle scheinbar selbst (unter-)Hashtabellen
sind, in Perl sind das aber eben _Referenzen_ auf (unter-) Hashtabellen.

Von diesen Values habe ich - im Glauben eine Hash_tabelle_ (und nicht wie
in Wirklichkeit bereits eine Referenz darauf) vor mir zu haben, noch mal
die Referenz gebildet.

So hatte ich also tatsàchlich Ref auf Ref auf Hashtabelle.

my %m_Sides (
p => {
SideKey => 'p',
Name => "primaer",
Par => {
Sg => 1,
Null => 2,
Sn => 3,
UnLL => 4,
},
},
);

$m_Sides{p} _ist_ bereits eine Referenz auf die sub-Hashtabelle, keine Hashtabelle selbst.

Ich hatte mit
my $refCurrentSide = \$m_Sides{p}; #falsch oder zumindest irreführend
anstelle von
my $refCurrentSide = $m_Sides{p}; #richtig
gearbeitet ...


Aber ein bisschen bin ich auch auf den Debugger sauer, der hàtte mir das
ruhig klar machen können.
Offenbar macht er beim Kommand "x" immer eine de-Referenzierung. Das
war für mich dann eine zuviel um es zu verstehen.


Kann mir jemand meine Perl-Welt zurechtrücken??


alles wieder im Lot ...


Joerg

Ähnliche fragen