Thread while frage (6 answers)
Opened by mark05 at 2011-09-01 09:35

pq
 2011-09-01 11:47
#152000 #152000
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
2011-09-01T08:02:00 topeg
Häufig ist es aber besser mit exists zu testen, denn mit einem Test auf defined wird ein Eintrag angelegt wenn er nicht existiert.

das stimmt nicht.

Code: (dl )
1
2
3
4
5
6
7
$ perl -wE'
my $foo = { bar => [1,2,3]};
say 1 if defined $foo->{bar}->[42];
say for @{ $foo->{bar} }'
1
2
3


da wird gar kein eintrag angelegt.
autovivification wird immer wieder missverstanden.
wenn ich $foo->{blubb}->[123] abfrage, wird der key blubb in $foo angelegt. das aber auch unabhängig davon, ob ich exists oder defined verwende.
die autovivification entsteht dadurch, dass ich mit $foo->{blubb}->[123] in $foo->{blubb} ein array erwarte und es gleichzeitig dereferenziere, als sei es schon da. und in dem moment legt perl es für mich an.

Code (perl): (dl )
1
2
3
4
5
6
7
8
my $foo = { bar => [1,2,3] };
exists $foo->{bar}->[42]; # legt gar nix an
defined $foo->{bar}->[42]; # legt gar nix an

# genauso mit einem hash of hashes
$foo = { bar => { a => "b" } };
exists $foo->{bar}->{boo}; # legt gar nix an
defined $foo->{bar}->{boo}; # legt gar nix an
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem

View full thread while frage