Почему в этом случае работает автовификация Perl?
Может ли кто-нибудь помочь мне понять вывод этой Perl-программы:
use Data::Dumper;
my %hash;
$hash{hello} = "foo";
$hash{hello}{world} = "bar";
print $hash{hello} . "\n";
print $hash{hello}{world} . "\n";
print Dumper(\%hash);
И вывод:
foo
bar
$VAR1 = {
'hello' => 'foo'
};
Откуда исходит "foo"? Почему это не распечатано самосвалом?
Обратите внимание, что если я поменяю местами порядок назначений:
use Data::Dumper;
my %hash;
$hash{hello}{world} = "bar";
$hash{hello} = "foo";
print $hash{hello} . "\n";
print $hash{hello}{world} . "\n";
print Dumper(\%hash);
мой вывод - это то, что я ожидаю:
foo
$VAR1 = {
'hello' => 'foo'
};
РЕДАКТИРОВАТЬ: я знаю, что use strict;
поймал бы это, но мне больше интересно знать, как строка "foo" все еще печатается.
4 ответа
Ваш код отсутствует
use strict;
C:\Temp> Хуэй Нельзя использовать строку ("foo") в качестве ссылки на HASH, в то время как "строгие ссылки" используются в C:\Temp\hui.pl строка 7.
Убедитесь, что все ваши сценарии начинаются с:
use strict;
use warnings;
Дано:
$hash{hello} = "foo";
$hash{hello}
НЕ ссылка на хеш
$hash{hello}{world} = "bar";
рассматривает строку "foo"
в качестве ссылки на хэш и создает хэш %main::foo
и устанавливает $foo{world}
в "bar"
,
Когда вы делаете:
print Dumper \%hash;
он печатает только содержимое %hash
, Тогда как, когда вы делаете
print $hash{hello}{world} . "\n";
это печатает $foo{world}
,
Без strict
Вы не можете обнаружить, что скрипт растоптал все пространство имен пакета.
Добавить
print Dumper \%main::;
или же
print Dumper \%main::foo;
проверить таблицу символов после того, как вы запустите это.
В основном строка "foo" является единственным значением %hash
, но (из-за несложности) создается%foo, который содержит (world => "bar")
Автовивификация работает только тогда, когда вы начинаете с неопределенными значениями. Так как ваш $hash{hello}
не является неопределенным значением, вы не можете автоматически выбрать следующий уровень. Вместо этого вы в конечном итоге использовать $hash{hello}
в качестве мягкой ссылки.
Если вы используете строгий, вы получите ошибку с вашим скриптом.
Нельзя использовать строку ("foo") в качестве ссылки HASH, в то время как "строгие ссылки" используются в...