exists
функция может unexpectedly autovivify entries в хешей.Почему `существует` изменяет мою константу?
Что меня удивляет, что такое поведение переносится на постоянных, а также:
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
Выход
{ a => { b => "c" }, foo => { bar => "baz" } } No data for 'soda->cola->pop' { a => { b => "c" }, foo => { bar => "baz" }, soda => { cola => {} } }
Я подозреваю, что это ошибка. Является ли это чем-то 5.10.1 конкретным, или другие версии Perl ведут себя одинаково?
Вы можете отключить автовивитацию для любой лексической области, используя «no [autovivification] (http://search.cpan.org/perldoc?autovivification)». – rafl
Мой вопрос был больше о изменчивом поведении констант с 'exist', а не о том, как я мог его избежать. – Zaid
при работе с константами, помните, что 'use constant PI => 3.14' совпадает с' sub PI() {3.14} 'и' use constant data => {...} 'is' {my $ data = { ...}; sub data() {$ data}} ' –