0

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

有任何想法吗?

4

1 回答 1

2

你需要use strict;(当你真正陷入困境时use warnings;,也许use diagnostics;也是如此)。作为一般规则,总是 use strict;use warnings;因为它们可以防止有问题的代码运行并为您提供一些更有帮助的输出。

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

您的变量$running_scripts不是哈希,而是“哈希引用”,这是一个重要的区别。当你调用ref一个真正的散列时,它返回一个假值,因为它不是一个引用。

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

为了使keys调用生效,有一个单独的解除引用语法。

my $script_is_running = $running_scripts->{ScriptRunning};
my @keys_in_running_scripts = keys %{$running_scripts};
于 2020-03-16T20:14:34.717 回答