мой анализ примера автовификации Perl - PullRequest
2 голосов
/ 22 декабря 2011

Рассмотрим этот фрагмент кода Perl,

$array[$x]->{“foo”}->[0]= “January”;

Я анализирую этот код следующим образом: запись с индексом $ x в «массиве» является хэш-ссылкой. Что касается этого хеша, когда его ключ - «foo», его значением является массив, а 0-й элемент для этого массива - «январь». Мой анализ правильный или нет? Спасибо.

Ответы [ 3 ]

11 голосов
/ 22 декабря 2011

Ваш анализ структуры корректен, однако соответствующий пример автовивификации будет выглядеть примерно так:

#!/usr/bin/env perl

use strict;
use warnings;

use 5.10.0; # say

my @array;

# check all levels are undef in structure

say defined $array[0] ? 'yes' : 'no';         # no
say defined $array[0]{foo} ? 'yes' : 'no';    # no
say defined $array[0]{foo}[0] ? 'yes' : 'no'; # no

# then check again

say defined $array[0] ? 'yes' : 'no';         # yes (!)
say defined $array[0]{foo} ? 'yes' : 'no';    # yes (!)
say defined $array[0]{foo}[0] ? 'yes' : 'no'; # no

Обратите внимание, что вы ничего не присвоили, на самом деле все, что вы сделали, это проверили,что-то существуетАвтовивификация происходит, когда вы проверяете многоуровневую структуру данных на некотором уровне x, а затем внезапно все уровни ниже (x-1 ... 0) внезапно появляются.

Это означает, что

say defined $array[0]{foo}[0] ? 'yes' : 'no';

эффективноэквивалентно

$array[0] = {};
$array[0]{foo} = [];
say defined $array[0]{foo}[0] ? 'yes' : 'no';
4 голосов
/ 22 декабря 2011

Да, ваш анализ верен.

Это НЕ Говер, анализ автовивификации, это анализ многоуровневой структуры данных.

Мы не можем знать, происходит ли автовивздесь или нет, потому что мы не можем определить, являются ли какие-либо из промежуточных значений неопределенными ...

1 голос
/ 22 декабря 2011

tadmc имеет правильный ответ. Ваш анализ верен. Однако автовификация - это нечто другое. Рассмотрим этот пример:

perl -wE 'my @a; $a[1]->{foo}->[0] = "aa"; use Data::Dumper; print Dumper \@a;'

$VAR1 = [
          undef,
          {
            'foo' => [
                       'aa'
                     ]
          }
        ];

В этом примере мы объявляем только массив @a. Но, присваивая значение воображаемой структуре в @a, мы автоматически создаем его. Мы добавляем ссылку на хэш для второго элемента в @a и ссылку на массив для ключа foo в этом хеше. Это не то, что мы объявили, Perl автоматически оживляет это для нас.

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