Почему значение undef становится допустимой ссылкой на массив в Perl? - PullRequest
9 голосов
/ 29 октября 2009

В Perl 5.8.5, если я сделаю следующее, я не получу ошибку:

use strict;

my $a = undef;
foreach my $el (@$a) {
  ...whatever
}

Что здесь происходит? Распечатка вывода ref($a) показывает, что $a в какой-то момент становится действительной ссылкой на массив. Но я никогда явно не устанавливал $a на что-либо.

Кажется странным, что содержимое переменной может измениться, если я ничего не сделаю.

Мысли, кто-нибудь?

РЕДАКТИРОВАТЬ: Да, я знаю все об авививизации. Я всегда думал, что где-то по пути должно быть назначение, а не просто ссылка.

Ответы [ 2 ]

15 голосов
/ 29 октября 2009

Авто-вивификация это слово. По ссылке:

Автовивификация является отличительной чертой программирования на Perl язык с участием динамического создание структур данных. Автовивификация автоматическая создание ссылки на переменную, когда неопределенное значение разыменовывается. В другими словами, Perl автовивификации позволяет программисту ссылаться на структурированная переменная и произвольная подэлементы этого структурированного переменная, без явного объявления существование переменной и ее полная структура заранее.

В контраст, другие языки программирования либо: 1) требовать от программиста явно объявить всю переменную структура перед использованием или ссылкой на любая его часть; или 2) требуют программист, чтобы объявить частью переменная структура перед обращением к любая его часть; или 3) создать присвоение части переменной перед ссылкой, назначением или составление выражения, которое относится к любая часть этого.

Автовывоз Perl можно противопоставить таким языкам, как Python, PHP, Ruby, JavaScript и всем языкам стилей C.

Авто-вивификация может быть отключена с помощью no autovivification;

11 голосов
/ 29 октября 2009

Читать Статья Ури Гутмана об автовивификации .

В этом нет ничего странного, если вы знаете об этом и сохраняете много неловкости.

Perl сначала оценивает выражение разыменования и видит, что текущее значение ссылки не определено. Он отмечает тип разыменования (скаляр, массив или хэш) и выделяет анонимную ссылку этого типа. Затем Perl сохраняет это новое ссылочное значение, в котором было сохранено неопределенное значение. Затем операция разыменования продолжается. Если вы делаете вложенное выражение разыменования, то каждый уровень сверху вниз может вызывать свое собственное авививация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...