将哈希从第一个键排序到最后一个键(Perl)

时间:2012-11-08 01:37:14

标签: perl sorting hash

我有以下哈希,我希望按照我设置的顺序保留它;这有可能吗?如果没有,是否存在任何替代方案?

my %hash = ('Key1' => 'Value1', 'Key2' => 'Value2', 'Key3' => 'Value3');

我是否需要编写自定义排序子例程?我有什么选择?

谢谢!

5 个答案:

答案 0 :(得分:8)

http://metacpan.org/pod/Tie::IxHash

use Tie::IxHash;
my %hash;
tie %hash,'Tie::IxHash';

此哈希将保持其顺序。

答案 1 :(得分:2)

Tie::Hash::Indexed。引用其概要:

use Tie::Hash::Indexed;

tie my %hash, 'Tie::Hash::Indexed';

%hash = ( I => 1, n => 2, d => 3, e => 4 );
$hash{x} = 5;

print keys %hash, "\n";    # prints 'Index'
print values %hash, "\n";  # prints '12345'

答案 2 :(得分:1)

尝试这样做:

print "$_=$hash{$_}\n" for sort keys %hash;

如果您希望按字母顺序排序。

如果您需要保留原始订单,请参阅其他帖子。

请参阅http://perldoc.perl.org/functions/sort.html

答案 3 :(得分:1)

一种可能性就是你有时对数组做同样的事情:指定键。

 for (0..$#a) {  # Sorted array keys
     say $a[$_];
 }

 for (sort keys %h) {  # Sorted hash keys
     say $h{$_};
 }

 for (0, 1, 3) {  # Sorted array keys
     say $h{$_};
 }

 for (qw( Key1 Key2 Key3 )) {  # Sorted hash keys
     say $h{$_};
 }

您还可以按如下方式获取有序值:

 my @values = @h{qw( Key1 Key2 Key3 )};

答案 4 :(得分:0)

这取决于您将如何访问数据。如果您只想存储它们并访问最后/第一个值,您可以始终将哈希值放在数组中并使用push()和pop()。

#!/usr/bin/env perl

use strict;
use warnings;

use v5.10;

use Data::Dumper;

my @hashes;

foreach( 1..5 ){
    push @hashes, { "key $_" => "foo" };
}


say Dumper(\@hashes);