Хранение вывода «JSON to HASH» в переменной приводит к тому, что Data :: Dumper не работает в perl - PullRequest
0 голосов
/ 12 июня 2019

У меня возникает проблема при попытке сохранить JSON, поступающий из строки в хэш.Взгляните на этот пример:

use strict;
use warnings;
use utf8;

use JSON;
use Data::Dumper;



my %hash1 = %{get_hash_from_json()};

print "Final Dump:\n";
print Dumper \%hash1 . "\n";

print "Keys:\n";
for (keys %hash1) {printf "key is $_\n";} 




sub get_hash_from_json (){

    my $json = '{"hello": "world", "hello2": "world"}';


    print "Dumper without variable:\n";
    print Dumper (from_json($json)) . "\n";


    print "Dumper with variable:\n";
    my $hash_ref = from_json($json);
    my %hash = %{$hash_ref};
    print Dumper \%hash . "\n";


    return from_json($json);
}

И вывод:

main::get_hash_from_json() called too early to check prototype at example.pl line 10.
 Dumper without variable:
 $VAR1 = {
      'hello' => 'world',
      'hello2' => 'world'
    };

Dumper with variable:
$VAR1 = 'HASH(0x29c88e0)
';
Final Dump:
$VAR1 = 'HASH(0x2512438)
';
Keys:
key is hello2
key is hello

Кто-нибудь понимает, почему это происходит?Каким-то образом хэш существует, но Data :: Dumper не возьмет его?

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

Проблема приоритета.

print Dumper \%hash . "\n";

означает

print(Dumper(\%hash . "\n"));

, но вы хотите

print(Dumper(\%hash) . "\n");

Дело в том, что значение, возвращаемое Dumper, уже будетзакончите новую строку, так что вам действительно не нужна другая.Следующее будет делать:

print(Dumper(\%hash));

Если вы хотите опустить парены, здесь нет никакого вреда.

print Dumper \%hash;

Что касается предупреждения, связанного с прототипом, вы получаетеэто потому, что компилятор встречает вызов подпрограммы с прототипом до объявления этой подпрограммы.В этой ситуации при вызове не использовался прототип, поэтому Perl сообщает вам, что это произошло.

Простое решение состоит в том, чтобы просто удалить бесполезный прототип (() в sub get_hash_from_json ()).

3 голосов
/ 12 июня 2019

Вы стали жертвой старшинства.

print Dumper \%hash1 . "\n";

. объединяет \%hash1 и символ новой строки, и вот что выводит Dumper. Поставьте круглые скобки вокруг него, чтобы он работал.

print Dumper(\%hash1) . "\n";

Или используйте say.

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