Извлечение значений из ха sh, созданного perl JSON :: Syck :: Load - PullRequest
0 голосов
/ 16 марта 2020

У меня очень простая проблема Perl, которую я не могу понять на всю жизнь.

Я потребляю JSON отформатированные данные с конечной точки REST в perl скрипт. Данные имеют следующую форму:

{
   "ScriptRunning": true
}

Есть еще кое-что, но на самом деле все, что меня волнует, - это тег ScriptRunning. Я использую эти данные, используя JSON :: Syck :: Load примерно так:

my $running_scripts = JSON::Syck::Load($output_from_rest_call)

(в моей текущей среде невозможно получить другие библиотеки для CPAN, поэтому я застрял с который). Все, что работает правильно, насколько я могу судить, я использовал Data :: Dumper, чтобы подтвердить, что данные выглядят хорошо:

$VAR1 = {
    'ScriptRunning' => 1 # or '' if false
}

Однако я не могу понять, как на самом деле получить значение ' ScriptRunning. Я сделал print ref $running_scripts и подтвердил, что это HASH, однако, когда я пытаюсь индексировать в га sh, я ничего не получаю. Я пробовал следующее:

my $script_is_running = $running_scripts{'ScriptRunning'};
my $script_is_running = $running_scripts{ScriptRunning};
my $keys_in_running_scripts = keys $running_scripts; # keys_in_running_scripts is empty
my $keys_in_running_scripts = keys %running_scripts; # keys_in_running_scripts is empty

Есть идеи?

1 Ответ

2 голосов
/ 16 марта 2020

Вам нужно use strict;use warnings;, пока вы на нем, может быть, use diagnostics;, когда вы действительно застряли). Как правило, ВСЕГДА use strict; и use warnings;, потому что они предотвращают запуск проблемного кода c и дают вам гораздо более полезный вывод.

Вы также должны прочитать perldoc perlreftut, который помогает объяснить, с чем вы имеете дело.

Ваша переменная $running_scripts - это не ха sh, а "ссылка на ха sh", которая является важной различие. Когда вы вызываете ref на реальном ха sh, он возвращает ложное значение, так как это не ссылка.

Вам нужно сделать «разыменование» с помощью оператора стрелка чтобы получить значение.

Чтобы заставить keys работать, есть отдельный синтаксис для разыменования.

my $script_is_running = $running_scripts->{ScriptRunning};
my @keys_in_running_scripts = keys %{$running_scripts};
...