La fonction exists
peut unexpectedly autovivify entries dans les hachages.Pourquoi `exists` modifie-t-il ma constante?
Ce qui me surprend est que ce comportement se répercute sur les constantes ainsi:
use strict;
use warnings;
use Data::Dump 'dump';
use constant data => {
'foo' => {
'bar' => 'baz',
},
'a' => {
'b' => 'c',
}
};
dump data; # Pre-modified
print "No data for 'soda->cola->pop'\n" unless exists data->{soda}{cola}{pop};
dump data; # data->{soda}{cola} now sprung to life
Sortie
{ a => { b => "c" }, foo => { bar => "baz" } } No data for 'soda->cola->pop' { a => { b => "c" }, foo => { bar => "baz" }, soda => { cola => {} } }
Je soupçonne que c'est un bug. Est-ce spécifique à 5.10.1, ou est-ce que les autres versions de Perl se comportent de la même façon?
Vous pouvez désactiver l'autovivification pour toute portée lexicale en utilisant "no [autovivification] (http://search.cpan.org/perldoc?autovivification)". – rafl
Ma question était plus sur le comportement mutable des constantes avec 'existes 'plutôt que sur comment je pourrais l'éviter. – Zaid
lorsque vous utilisez des constantes, rappelez-vous que 'use constant PI => 3.14' est identique à' sub PI() {3.14} 'et' use constant data => {...} 'est' {my $ data = { ...}; sub data() {$ data}} ' –