从 perl JSON::Syck::Load 创建的散列中提取值

Extracting values from hash created by perl JSON::Syck::Load

我遇到了一个非常简单的 Perl 问题,我一辈子都无法解决。

我在 perl 脚本中使用来自 REST 端点的 JSON 格式化数据。数据的形状是这样的:

{
   "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,但是当我尝试索引到哈希中时,我没有得到任何东西。我尝试了以下方法:

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

有什么想法吗?

你需要use strict;(当你在做的时候use warnings;,当你真的被卡住的时候,也许use diagnostics;也是)。作为一般规则,ALWAYS use strict;use warnings; 因为它们可以防止 运行 中有问题的代码并为您提供更有用的输出。

您还应该阅读 perldoc perlreftut,这有助于解释您正在处理的内容。

你的变量$running_scripts不是散列,而是"hash reference",这是一个重要的区别。当您在真实哈希上调用 ref 时,它 returns 是一个错误值,因为它不是引用。

您需要做的是 "dereference" 使用 arrow operator 获取值。

为了使 keys 调用起作用,有一个单独的取消引用语法。

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