Perl: присвоение массива хешу - PullRequest
18 голосов
/ 22 марта 2011

Этот синтаксис работает:

$b{"x"} = [1,2,3];
pp %b;
# Displays ("x", [1, 2, 3]) 

Но мне нужно иметь возможность динамически создавать содержимое массива и назначать его позже. Это не работает; помогите, что за очевидная часть мне не хватает ?

@a = [1,2,3];
$b{"x"} = @a;
pp %b;
# Shows up as ("x", 1) ... not what I want or expected.

Пробовал и эти варианты тоже.

$b{"x"} = [@a];  # ("x", [[1, 2, 3]])  ...close

$b{"x"} = \@a;   # ("x", [[1, 2, 3]])  

$b{"x"} = [\@a]; # ("x", [[[1, 2, 3]]])  

$b{"x"} = %a;    # ("x", 0)

$b{"x"} = $a;    # ("x", undef)

$b{"x"} = [$a];  # ("x", [undef])

$b{"x"} = @{@a};  # ("x", 0) 

И, в идеале, я бы хотел позже вывести массив в виде массива.

Ответы [ 2 ]

35 голосов
/ 22 марта 2011

Часть, которую вы пропустили, состоит в том, что @a = [1,2,3] не создает массив из 3 элементов.Он создает массив с одним элементом, который является arrayref.

Вы имели в виду @a = (1,2,3).

Чтобы назначить этот массив хеш-элементу, вы должны использовать либо $b{"x"} = [@a], либо * 1008.* в зависимости от того, что вы пытаетесь сделать.[@a] создает новый массив, содержащий копию текущего содержимого @a.Если после этого содержимое @a изменится, оно не повлияет на $b{x}.

С другой стороны, \@a дает ссылку на сам @a.Если вы затем измените содержимое @a, это будет видно в $b{x} (и наоборот).

15 голосов
/ 22 марта 2011

Вам необходимо прочитать документацию perlref , в которой говорится о ссылках.

Существует разница в том, как хранятся ваши массивы:

# this is an array in an array variable
@a = (1, 2, 3);

Стихи, хранящие ссылка на массив:

# this is an array in a scalar variable stored as a reference to the previous array:
$b = \@a;

Функционально, который работает как указатель.Таким образом, вы также можете сохранить эту ссылку в хэше:

$x{'something'} = \@a;

Все это работает просто отлично.Чего вы не поняли, так это того, что [] создает ссылку на массив, который вы не можете сохранить в переменной массива.Вы должны хранить его в скаляре.Таким образом, вместо этого:

$c = [1, 2, 3];
$x{'else'} = $c;

будет работать.

И получить доступ и изменить массив перед выполнением второго назначения можно с помощью:

$c->[3] = '4';

илииспользуя его в виде массива , сначала разыменовав его

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