La función exists
puede unexpectedly autovivify entries en hashes.¿Por qué `exists` modifica mi constante?
Lo que me sorprende es que este comportamiento se traslada a las constantes así:
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
salida
{ a => { b => "c" }, foo => { bar => "baz" } } No data for 'soda->cola->pop' { a => { b => "c" }, foo => { bar => "baz" }, soda => { cola => {} } }
Sospecho que esto es un error. ¿Es esto algo específico de 5.10.1, o las otras versiones de Perl se comportan de manera similar?
Puede desactivar la autovibución para cualquier alcance lóxico usando "no [autovivification] (http://search.cpan.org/perldoc?autovivification)". – rafl
Mi pregunta era más sobre el comportamiento mutable de las constantes con 'exists' en lugar de cómo podría evitarlo. – Zaid
cuando se trabaja con constantes, recuerde que 'use constante PI => 3.14' es lo mismo que' sub PI() {3.14} 'y' use constante data => {...} 'es' {my $ data = { ...}; sub data() {$ data}} ' –