Funkcja exists
może mieć wartości unexpectedly autovivify entries w hasłach.Dlaczego `istnieje` modyfikuje moją stałą?
Co mnie dziwi to, że to zachowanie przenosi się na stałe, a także:
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
Wyjście
{ a => { b => "c" }, foo => { bar => "baz" } } No data for 'soda->cola->pop' { a => { b => "c" }, foo => { bar => "baz" }, soda => { cola => {} } }
I podejrzewam, że jest to błąd. Czy jest to coś specyficznego dla wersji 5.10.1, czy też inne wersje Perla zachowują się podobnie?
Możesz wyłączyć autoworyzację dla dowolnego zakresu leksykalnego za pomocą "nie [autoworyzacja] (http://search.cpan.org/perldoc?autovivification)". – rafl
Moje pytanie dotyczyło bardziej zmiennego zachowania stałych z "istnieniem" niż tego, jak można tego uniknąć. – Zaid
podczas pracy ze stałymi pamiętaj, że 'użyj stałej PI => 3.14' jest tym samym, co' sub PI() {3.14} ', a' use constant data => {...} 'is' {my $ data = { ...}; sub dane() {$ dane}} ' –