4

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

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

我需要编写自定义排序子程序吗?我有哪些选择?

谢谢!

4

5 回答 5

8

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

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

此哈希将保持其顺序。

于 2012-11-08T01:41:12.497 回答
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'
于 2012-11-08T01:43:26.887 回答
1

尝试这样做:

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

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

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

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

于 2012-11-08T01:40:01.620 回答
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 )};
于 2012-11-08T01:57:22.480 回答
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);
于 2012-11-14T11:05:35.853 回答