【问题标题】:How to convert a string to hash in perl without using regex or split如何在不使用正则表达式或拆分的情况下将字符串转换为 perl 中的哈希
【发布时间】:2018-11-08 19:55:15
【问题描述】:

我有一个我无法控制的函数,它返回一个实际上是哈希的字符串。它看起来像下面这样:

{"offset":0,"limit":500,"count":0,"virtual_machines":[]}

我需要检查计数是否大于 0。因为输出是字符串而不是哈希,所以我正在尝试拆分字符串并从中获取输出。

相同的sn-p如下:

my $output = '{"offset":0,"limit":500,"count":0,"virtual_machines":[]}';
$output =~ s/ +/ /g;
my @words = split /[:,"\s\/]+/, $output;
print Dumper(@words);

这个的输出是:

$VAR1 = '{';
$VAR2 = 'offset';
$VAR3 = '0';
$VAR4 = 'limit';
$VAR5 = '500';
$VAR6 = 'count';
$VAR7 = '0';
$VAR8 = 'virtual_machines';
$VAR9 = '[]}';

现在,我可以获取 $VAR7 的值并获取计数。

有没有办法将字符串转换为哈希,然后使用键来获取值,而不是使用正则表达式和拆分。谁能帮帮我!

【问题讨论】:

    标签: json regex perl


    【解决方案1】:

    该字符串为 JSON 格式。我会做的

    use strict;
    use warnings;
    use JSON::PP qw(decode_json);
    
    my $output = '{"offset":0,"limit":500,"count":0,"virtual_machines":[]}';
    my $data = decode_json $output;
    
    print $data->{count}, "\n";
    

    【讨论】:

    • 这可能值得注意 - 解析为 JSON 意味着您不会被 JSON 支持的嵌套数据结构所困扰。正则表达式对于这项工作来说是一个完全不合适的工具。例如。 virtual_machines 是一个列表,如果你解析不好,一台名为 "limit" 的机器(或具有“限制”属性)可能会导致真正的问题。
    【解决方案2】:

    如果所有冒号都只是分隔符,那么您可以将它们替换为 '=>' 并评估字符串。 不过,这可能是不现实的。所以你可以使用 JSON ...看起来字符串是 JSON 格式。尝试以下方法(为我工作:-):

    #!/usr/bin/perl
    
    use JSON::Parse 'parse_json';
    
    # the string is JSON
    my $jstr = '{"offset":0,"limit":500,"count":0,"virtual_machines":[]}';
    
    # oversimplified (not using json ... o.k. if no colons anywhere but as separators
    my $sstr = $jstr;
    $sstr =~ s/:/=>/g;
    my $href = eval "$sstr";
    printf("From oversimplified eval, limit == %d\n", $href->{limit});
    
    # using JSON (looks like string is in JSON format).
    # get JSON::Parse from CPAN (sudo cpan JSON::Parse)
    my $jref = parse_json($jstr);
    printf("From JSON::Parse, limit == %d\n", $jref->{limit});
    
    1;
    


    输出:

    从过度简化的评估中,限制 == 500
    来自 JSON::Parse,限制 == 500

    【讨论】:

    • 不要做sudo cpan。如果 JSON::PP 是核心模块,为什么要从 CPAN 获取 JSON::Parse?为什么要推荐JSON::Parse?它的 Unicode 处理被设计破坏了。为什么不使用warningsstrict
    • @melpomene,我的示例有效。您是否将我从 0 降级为 -3 作为一个工作示例?如果您知道有改进,那很好。但是,如果您认为 JSON::Parse 是“被设计破坏的”,那么请在 JSON::Parse 的 CPAN 文档中这样说。我没有看到你的名字有任何问题,无论是开放的还是封闭的。我不相信您对我的评论的处理符合 stackoverflow 的预期精神。
    • 我没有把你投给-3。和其他人一样,我只有一票。在我的评论中,我提出了四个不同的问题。您没有解决任何问题(通过更改代码或告诉我为什么我错了)。至于 JSON::Parse 文档,请参阅here: "JSON::Parse only parses the UTF-8 format [...] my $input_utf8 = decode ('UTF-16', $input); my $perl = parse_json ($input_utf8);",这表明了对编码的根本误解.尚不清楚 parse_json 是采用 UTF-8(即编码中的字节)还是解码的文本字符串。
    • JSON::PP 似乎是一种更可取的方法。但在我看来,关键在于显示的输出看起来像 JSON,并且有现有的 Perl 包来处理它。 Dumper 仍然让您进行解析。这个问题不涉及 UTF-XXX,尽管它在生产中肯定是相关的。如果实际上声称输出是 JSON,那么我们可能还需要一些错误检测逻辑。我猜其他反对票没有发表评论?顺便说一句,我想我们几乎同时添加了我们的答案,因为我开始时没有看到你的答案,但当我保存时看到了。
    猜你喜欢
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2020-11-20
    • 2017-01-06
    • 1970-01-01
    相关资源
    最近更新 更多