从 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};
我遇到了一个非常简单的 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};