存储按键顺序的哈希数组

时间:2016-04-12 19:06:42

标签: perl

我正在使用此代码对我的哈希数组进行排序和存储。

    my @sorted_data;
        for my $k (sort keys %data) {
          push @sorted_data, { duplicates => $k, refs => join( ',', @{ $data{$k} } )};
        }

但是,钥匙需要订购,而不是。

输出:

    print Dumper \@sorted_data;

    $VAR1 = [
              {
                'refs' => 'AMD,ANF',
                'duplicates' => '(111) 111-9355'
              },
              {
                'duplicates' => '(111) 111-9385',
                'refs' => 'no ref'
              },
              {
                'refs' => 'Z1Z',
                'duplicates' => '(111) 111-2493'
              },
              {
                'duplicates' => '(111) 111-4588',
                'refs' => 'no ref'
              }
         ]

正如你所看到的那样,副本和引用有时是相反的,我每次都需要它们处于相同的顺序。

期望的输出:

    $VAR1 = [
                  {
                    'duplicates' => '(111) 111-9355',
                    'refs' => 'AMD,ANF'
                  },
                  {
                    'duplicates' => '(111) 111-9385',
                    'refs' => 'no ref'
                  },
                  {
                    'duplicates' => '(111) 111-2493',
                    'refs' => 'Z1Z'
                  },
                  {
                    'duplicates' => '(111) 111-4588',
                    'refs' => 'no ref'
                  }
             ]

是的,这就是我制作我的结构的方式,但我的转储看起来像这样,它反映在导出中。

[ 
  { duplicates => "(111) 111-2493", refs => "Z1Z" },
  { duplicates=> "(111) 111-4588", refs => "no ref" },
  { duplicates => "(111) 111-9355", refs => "AMD,ANF" },
  { ref=> "no ref", duplicates => "(111) 111-9385" },
  { duplicates => "(111) 111-9356", refs => "AMD" },
  { ref=> "no ref", duplicates => "(111) 111-9386" },
  { duplicates => "(111) 111-9359", refs => "ANF" },
 ]

并且我对excel输出的导出与结构中的whats匹配。

  TNs               REFs
  (111) 111-2493    Z1Z
  (111) 111-4588    no ref
  (111) 111-9355    AMD,ANF
  no ref            (111) 111-9385
  (111) 111-9356    AMD
  no ref            (111) 111-9386
  (111) 111-9359    ANF

3 个答案:

答案 0 :(得分:6)

Hash keys have no inherent order,这也是他们如此高效的部分原因。每次都必须对其键列表进行排序。这可能是你想去的路线。

如果你想要一个类似哈希的结构来保持其密钥排序look into trees,尽管有一种令人眼花缭乱的变种。

或者,Tie::IxHash保留其原始密钥顺序,但性能成本很高。

答案 1 :(得分:1)

您开始使用的数据结构如下所示

my %data = (
  '(111) 111-4588' => ['no ref'],
  '(111) 111-9385' => ['no ref'],
  '(111) 111-9355' => ['AMD', 'ANF'],
  '(111) 111-2493' => ['Z1Z'],
)

告诉我们这一点,会更有用,并给出了你想要的结果的例子。相反,我必须编写一些代码来反向设计您提供的信息

下面的程序似乎是对您自己的代码的合理复制,并且您可以看到数组元素按其哈希的duplicates元素的顺序排列。正如其他人所观察到的那样,在这些哈希中,元素没有特定的顺序

我不明白你想要什么?有关键的“随机顺序”是一个问题怎么样?

use strict;
use warnings 'all';

use Data::Dump;

my %data = (
  '(111) 111-2493' => ['Z1Z'],
  '(111) 111-4588' => ['no ref'],
  '(111) 111-9355' => ['AMD', 'ANF'],
  '(111) 111-9385' => ['no ref'],
);

my @sorted_data;

for my $k ( sort keys %data ) {
    push @sorted_data, { duplicates => $k, refs => join( ',', @{ $data{$k} } ) };
}

dd \@sorted_data;

输出

[
  { duplicates => "(111) 111-2493", refs => "Z1Z" },
  { duplicates => "(111) 111-4588", refs => "no ref" },
  { duplicates => "(111) 111-9355", refs => "AMD,ANF" },
  { duplicates => "(111) 111-9385", refs => "no ref" },
]

答案 2 :(得分:0)

此代码解决了我的问题,谢谢。

for my $k (sort (keys %data)) {
      tie (my %dataconfig, 'Tie::IxHash','refs' => join( ',', @{ $data{$k} } ),'duplicates' => $k);
      push @sorted_data, \%dataconfig;
    }