Почему в этом случае работает автовификация 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, в то время как "строгие ссылки" используются в...

Другие вопросы по тегам