pu sh ha sh на массив в perl, результат не поддается пониманию - PullRequest
0 голосов
/ 15 февраля 2020

Простой вопрос, но я не смог найти объяснения в Интернете. Почему это ..

my @menu;

my %el1 = ("element1" => "hello");
push @menu, \%el1;

my %el2 = ("element2" => "world");
push @menu, \%el2;

print to_json({"menu", @menu});

производит это ..

{
    "menu": {
        "element1": "hello"
    },
    "HASH(0x18e2280)": null
}

, а не это ..

{
    "menu": {
        "element1": "hello",
        "element2": "world"
    }
}

Пожалуйста, помогите, perl влияет на мой психическое здоровье.

Ответы [ 2 ]

4 голосов
/ 17 февраля 2020

Вы поместили две ссылки ha sh на @menu. Поэтому, когда вы запускаете этот код:

print to_json({"menu", @menu});

Это так же, как если бы вы запустили:

print to_json({ "menu", \%el1, \%el2 });

Бит между { ... } интерпретируется как ха sh, поэтому первый и третьи элементы отображаются как ключи ha sh, а второй элемент - как значения. Таким образом, вы получите результат, который вы видите. (И, как было отмечено в комментариях, вы получите предупреждение под use warnings, поскольку у этого второго ключа нет связанного значения).

Я думаю, что вы хотели написать:

print to_json({ "menu", \@menu });

Но даже это не правильно. Вы получаете следующее:

{
    "menu":[{
        "element1":"hello"
    },{
        "element2":"world"
    }]
}

Два хэша, которые вы добавили в массив, все еще совершенно разные.

Но на самом деле вам нужен только один ха sh. Так что создайте это вместо этого.

#!/usr/bin/perl

use strict;
use warnings;
use JSON;
use Data::Dumper;

my @menu;

my %el1 = (
    "element1" => "hello",
    "element2" => "world",
);

print to_json({"menu", \%el1});
3 голосов
/ 15 февраля 2020

Если вы передадите ссылку в массив, результаты будут более чистыми:

print to_json({"menu", \@menu});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...