La funzione exists
può essere unexpectedly autovivify entries in hash.Perché `exists` modifica la mia costante?
Quello che mi sorprende è che questo comportamento trasporta oltre alle costanti così:
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
uscita
{ a => { b => "c" }, foo => { bar => "baz" } } No data for 'soda->cola->pop' { a => { b => "c" }, foo => { bar => "baz" }, soda => { cola => {} } }
Ho il sospetto che questo è un bug. Si tratta di qualcosa di specifico 5.10.1, o le altre versioni di Perl si comportano in modo simile?
È possibile disattivare l'autovivificazione per qualsiasi ambito lessicale utilizzando "no [autovivification] (http://search.cpan.org/perldoc?autovivification)". – rafl
La mia domanda riguardava più il comportamento mutabile delle costanti con 'exists' piuttosto che il modo in cui potevo evitarlo. – Zaid
quando si lavora con le costanti, ricorda che 'usa costante PI => 3.14' è uguale a' sub PI() {3.14} 'e' usa costante dati => {...} 'è' {my $ data = { ...}; sub data() {$ data}} ' –