【问题标题】:Extracting values from hash created by perl JSON::Syck::Load从Perl JSON :: Syck :: Load创建的哈希中提取值
【发布时间】:2020-06-27 22:31:17
【问题描述】:

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

有什么想法吗?

【问题讨论】:

    标签: json perl hashref


    【解决方案1】:

    你需要use strict;(和use warnings;,当你真的被困住时,也许use diagnostics;)。作为一般规则,始终 use strict;use warnings; 因为它们可以防止有问题的代码运行并为您提供一些更有帮助的输出。

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

    您的变量$running_scripts 不是哈希,而是“哈希引用”,这是一个重要的区别。当您在真实哈希上调用 ref 时,它会返回一个 false 值,因为它不是引用。

    您需要做的是使用arrow operator“取消引用”来获取值。

    要使keys 调用起作用,有一个单独的解除引用语法。

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

    【讨论】:

      猜你喜欢
      • 2013-12-20
      • 1970-01-01
      • 2011-04-20
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多