我有一个非常简单的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};