Die exists
Funktion kann unexpectedly autovivify entries in Hashes.Warum ist `Existieren` meine Konstante zu modifizieren?
Was mich wundert ist, dass dieses Verhalten auch auf Konstanten überträgt sich:
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
Ausgabe
{ a => { b => "c" }, foo => { bar => "baz" } } No data for 'soda->cola->pop' { a => { b => "c" }, foo => { bar => "baz" }, soda => { cola => {} } }
Ich vermute, dies ein Fehler ist. Ist das etwas 5.10.1-spezifisch oder verhalten sich andere Versionen von Perl ähnlich?
Sie können die Autovivifizierung für jeden lexikalischen Bereich mit "no [autovivification] (http://search.cpan.org/perldoc?autovivification)" deaktivieren. – rafl
Meine Frage war mehr über das veränderliche Verhalten von Konstanten mit 'exists' und nicht, wie ich es vermeiden könnte. – Zaid
Wenn Sie mit Konstanten arbeiten, denken Sie daran, dass 'Konstante PI verwenden => 3.14 'dasselbe ist wie' Sub PI() {3.14}' und 'Konstante Daten verwenden => {...}' ist '{my $ data = { ...}; Subdaten() {$ Daten}} ' –