【问题标题】:Perl: How to save keys order from hash?Perl:如何从哈希中保存键顺序?
【发布时间】:2023-04-07 18:13:01
【问题描述】:

我正在尝试显示来自 json 哈希的键

执行后,我显示了所有键,但顺序不同。我当时就卡住了。

是否有可能保存密钥顺序?

您的帮助将不胜感激。

谢谢。

【问题讨论】:

  • 您必须单独保存它们,例如在另一个数组或其他东西中。哈希的重点是不让键的顺序很重要......
  • @AntonH 那么,有什么方法可以使用数组而不是 json 的散列:以便我可以保存订单?
  • 那么不要使用散列来存储你解析的数据,而是将它存储在一个数组中。或者更好的是,使用 JSON 模块进行解析,不要尝试重新发明轮子。
  • @user6039980 取决于您如何阅读 JSON。如果您“手动”执行此操作,则在某些时候您必须自己执行此操作。如果它是一个自动库,那么您可能不得不使用它来按顺序获取密钥。您可能还需要考虑保留订单是否足够重要以花时间处理它,或者您是否可以解决它。

标签: perl hash


【解决方案1】:

根据定义,哈希没有顺序。 Perl 哈希和 JSON 结构也是如此。在 Perl 中,散列中键的顺序可能与它们添加到散列中的方式不同。两个 JSON 结构可以相互等价,但不能相同。

如果您需要按特定顺序排列的键,请在检查时使用sort 按您想要的顺序对键进行排序。

【讨论】:

    【解决方案2】:

    您可以创建一个列表(将被排序)并在每个列表元素中放置另一个包含 2 个字段(键和值)的列表。这实际上是一个有序的哈希。

    #!/usr/bin/perl
    
    %json = qw(key1 value1 key2 value2 key3 value3);
    my $result = "keys => { \n";
    for my $key (keys %json) {
      $result .= "$key\n";
    }
    $result .= " }\n\n";
    
    print $result;
    
    my $json=[];
    for my $key (sort keys %json) {
        my @list = ();
        push(@list,$key);
        push(@list,$json{$key});
        push(@$json,\@list);
    }
    
    for (@$json) {
        print $_->[0], " ", $_->[1], "\n";
    }
    

    【讨论】:

    • 谢谢。但在我的情况下,json 需要从文件中检索,而不是手动检索:所以我需要一种使用 'decode_json' 的方法。
    • 只需编写自己的 decode_json,它会包装原始文件,但会额外转换为列表。我怀疑你不应该做你想做的事。不需要订购 JSON。
    • 我需要订购只是为了测试。但现在没事了。我会忽略命令。谢谢,很有帮助。
    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2013-08-31
    • 2013-01-31
    • 2013-05-19
    • 2010-12-02
    • 2016-04-09
    相关资源
    最近更新 更多