Какова структура данных этой переменной в perl? - PullRequest
3 голосов
/ 09 декабря 2011

Я новичок в Perl и читаю код, написанный на Perl.Строка выглядит следующим образом:

$Map{$a}->{$b} = $c{$d};

Я знаком с хешем, похожим на %samplehash и доступным как $samplehash{a}="b"

, но что говорит вышеприведенная строка о том, что на самом деле является Map?

Ответы [ 3 ]

10 голосов
/ 09 декабря 2011

Учитывая эти переменные:

my $a = "apples";
my $b = "pears";
my %c = ("bananas" => 2);
my $d = "bananas";
my %Map;

Задание

$Map{$a}->{$b} = $c{$d};

Результат в хэше выглядит следующим образом:

%Map = (
    "apples" => {
        "pears" => 2
    }
);

%Map - это хэш, который после присваивания содержит ссылку на хэш посредством автовивификации: если это еще не сделано, внутренняя ссылка на хэш автоматически создается Perl путем доступа к элементу $Map{$a}->{$b} в хеше %Map.

5 голосов
/ 09 декабря 2011
$Map{$a}->{$b}

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

${ $Map{$a} }{$b}

что похоже на

$hash{$b}

только с использованием хеш-ссылки $Map{$a} вместо %hash.

См. http://perlmonks.org/?node=References+quick+reference для некоторых простых для запоминания правил использования вложенных структур данных.

Кроме того, при включенной автовификации (что по умолчанию), если $Map{$a} начинается как несуществующий или неопределенный, он будет неявно инициализирован как новая ссылка на хэш.

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

значение ключа $ a в $ Map является ссылкой на ассоциированный массив, имя которого хранится в $ b.

%Map = ( $a => { $b => $c{$d} }, ...)

...