从perl JSON::Syck::Load创建的哈希中提取值



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

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

{
"ScriptRunning": true
}

还有一些其他的东西,但我真正关心的是ScriptRunning标签。我使用JSON::Syck::像这样加载:来消耗这些数据

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;,当你真的陷入困境时(。作为一般规则,ALWAYuse strict;use warnings;,因为它们可以防止有问题的代码运行,并为您提供更有用的输出。

你还应该阅读perldoc perlreftut,它有助于解释你正在处理的问题。

变量$running_scripts不是散列,而是"散列引用",这是一个重要区别。当您对真实哈希调用ref时,它会返回一个假值,因为它不是引用。

您需要做的是使用箭头运算符"取消引用"来获取值。

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

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

最新更新