Struppi: Teil eines komplexen Hashes referenziert heraustrennen

Beitrag lesen

z.B.

my %I;
$I{'level1'}{'level2'}{'level3'}{'value1'}=1;

Oh seit wann geht das? Ich bin mir sicher, dass alte Perlversionen dir hier gesagt hätten, dass level1 keine Hashreferenz ist. Sie werden aber anscheinend mittlerweile automatisch erzeugt.

Du hast hier also schon ein Hash, mit drei Hashreferenzen erzeugt.

Jetzt möchte ich z.B. alles ab Level3 in einem anderen Hash referenzieren.

[...]

So funzt es nicht, weil hier dereferenziert wird:

Du kannst eine Referenz nur in einem Skalar speichern, d.h. eine Hashreferenz kannst du nicht einem Hash zuweisen. Du musst also genau überlegen, was du eigentlich willst.

Hier das gleiche:

my $I_ref=%{$I{'level1'}{'level2'}{'level3'}};

Das ist eine Referenz, allerdings umständlich, da es das Gleiche ist wie:

my $I_ref= $I{'level1'}{'level2'}{'level3'};

Ich bevorzuge aber die Pfeilschreibweise (wenn ich solch vertrackten Strukturen verwenden würde), dann sieht man das auch.

my $I_ref= $I{'level1'}->{'level2'}->{'level3'};

(ich weiß den zweiten Pfeil könnte man sich auch sparen, aber wie gesagt mir geht es um's sehen der Referenz)

Ich könnte zwar mit $I2->{...} die Referenz nutzen, müsste aber eben bei jeder Verwendung des Teilhashes den Pfeil mit verwenden.

Ja musst du. Weil es keine verschachtelteten Hashes oder Arrays gibt, die zweite Ebene ist immer eine Referenz, wie es Beat schon sagte.

Ist es nicht irgendwie möglich, dass die Referenz "unsichtbar" bleibt und ich eben nicht 11000 Zeilen Quelltext umschreiben muss?

Den möchte ich nicht sehen, wenn er solch verschachtelten Strukturen in der Form nutzt.

#/usr/bin/perl

Besser:
#/usr/bin/perl -w

print "\nDEBUG:SOURCE_HASH:".$I{'level1'}{'level2'}{'level3'}{'value1'};

Du kannst dir die ganze Struktur mit dem Standardmodul Data::Dumper ansehen,

use Data::Dumper;  
...  
print Dumper \%I;

Struppi.