Как я могу использовать массив в качестве хеш-значения в Perl? - PullRequest
0 голосов
/ 10 сентября 2009

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

$result = {
    count, 2,
    elementList, [
        {name => "John Doe", age => 23},
        {name => "Jane Doe", age => 24}
    ]
};

Я пытаюсь создать точно такой же код с таким кодом. Это работает:

my @elements = [
     {name => "John Doe", age => 23},
     {name => "Jane Doe", age => 24}
];

$result = {
    count, 2,
    elementList, @elements
};

Но это НЕ работает:

my @elements;
push(@elements, {name => "John Doe", age => 23});
push(@elements, {name => "Jane Doe", age => 24});

$result = {
    count, 2,
    elementList, @elements
};

Ответы [ 4 ]

7 голосов
/ 10 сентября 2009

Как уже упоминали другие, вы описываете необычную структуру данных: массив только с одним элементом, который является массивом ссылок на хэш-функции Я предполагаю, что вы действительно хотите эту структуру по какой-то причине.

my @elements = [
    {name => "John Doe", age => 23},
    {name => "Jane Doe", age => 24}
];

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

my @elements = [];
push(@{ $elements[0] }, {name => "John Doe", age => 23});
push(@{ $elements[0] }, {name => "Jane Doe", age => 24});

потому что вы хотите поместить хеш-ссылки в arrayref в $elements[0], а не в @elements массив.

Но необычно иметь массив только с одним элементом. Глядя на добавленный вами дополнительный код, вы действительно хотите получить следующее:

my $elementsRef = [];
push(@$elementsRef, {name => "John Doe", age => 23});
push(@$elementsRef, {name => "Jane Doe", age => 24});

Или это:

my @elements;
push(@elements, {name => "John Doe", age => 23});
push(@elements, {name => "Jane Doe", age => 24});

, а затем используйте \@elements там, где вы в данный момент используете @elements.

Любой из них будет работать. Вам решать, какой из них вы предпочитаете. Я бы, наверное, пошел со второй версией.

5 голосов
/ 10 сентября 2009

Вы присваиваете массиву ссылку (синтаксис []) на ваш массив. В качестве первого и единственного элемента, так как вы не указываете другие.

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

Ознакомьтесь с perldsc для ознакомления с предметом.

3 голосов
/ 10 сентября 2009

[] делает ссылку на пустой массив. Вы создаете массив с одним элементом. Просто скажите: my @elements;, чтобы создать пустой массив.

3 голосов
/ 10 сентября 2009

Неправильные скобки.

Вам действительно нужно построить такую ​​структуру:

my @elements = (
    {name => "John Doe", age => 23},
    {name => "Jane Doe", age => 24}
);

Чтобы сделать это в цикле, вам нужно изменить этот код:

my @elements;  # same as my @elements = ();
push(@elements, {name => "John Doe", age => 23});
push(@elements, {name => "Jane Doe", age => 24});

Причина в том, что квадратные скобки создают ссылку на массив. Ссылка на массив - это не то же самое, что массив.

Чтобы составить список элементов для присвоения массиву, используйте круглые скобки ().

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