Thread Ternärer Operator und inexistente Hash-Schlüssel (6 answers)
Opened by borisd at 2014-09-23 12:25

Linuxer
 2014-09-23 15:56
#177507 #177507
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Naja, die Autovivification ist IMHO hier aber nicht ausschlaggebend für das Verhalten. Sie kann aber (un)erwünschte Nebeneffekte bringen.

In Deinem gezeigten Beispiel ist das nicht ganz so tragisch, weil die Datenstruktur bis in die Tiefe schon vordefiniert ist (->very->deep->hash) und Du nur innerhalb dieser Tiefe auf einen Key zugreifst.

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

use Data::Dumper;

# hier definieren wir die Datenstruktur
my $data = { 
        foo => {},
};

my $var = $data->{foo}{bar}{baz}{barum} // 'not defined';

print "var: $var\n";

# und hier kontrollieren wir die Datenstruktur nochmal:
print Data::Dumper->new( [ $data ], '*data' )->Sortkeys(1)->Dump();


Resultat:
Code: (dl )
1
2
3
4
5
6
7
8
var: not defined
$VAR1 = {
'foo' => {
'bar' => {
'baz' => {}
}
}
};

Mein Beispiel ist nur bis zur ersten Ebene (->foo) definiert; es wird aber viel tiefer zugegriffen (auf "barum" in ->foo->bar->baz). Bei diesem Zugriff werden die fehlenden Ebenen automatisch angelegt. Das ist dann im Dump gut zu erkennen, dass plötzlich mehr Ebenen in der Hash-Struktur stecken als am Anfang definiert.
Dieses Verhalten ist toll, wenn man tiefe Struktur "on-the-fly" generieren will, kann aber eben bei solchen Abfragen - unerwünscht - Strukturen aufbauen...

Wenn, wie du geschrieben hast, Du aber viele Keys in vielleicht verschiedenen Orten abfragen willst, kann das schon zuschlagen...
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread Ternärer Operator und inexistente Hash-Schlüssel