我正在使用此代码对我的哈希数组进行排序和存储。
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
答案 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;
}