如何以添加元素的相同顺序打印哈希?

时间:2013-02-19 10:07:54

标签: perl

是否可以以LIFO或FIFO方式使用哈希?如何确保哈希的打印顺序与添加的元素的顺序相同?

#!/usr/bin/perl

print "content-type: text/html \n\n";

# BEGINNING HASH
%coins = ( "Quarter" , .25,
          "Dime" ,    .10,
          "Nickel",   .05 );
# PRINT THE OLD HASH
while (($key, $value) = each(%coins)){
    print $key.", ".$value."<br />";
}

# ADD NEW ELEMENT PAIRS
$coins{Penny} = .01;
$coins{HalfDollar} = .50;

# PRINT THE NEW HASH
print "<br />";
while (($key, $value) = each(%coins)){
     print $key.", ".$value."<br />";
}

这给出了

Nickel, 0.05
Dime, 0.1
Quarter, 0.25

Nickel, 0.05
Dime, 0.1
HalfDollar, 0.5
Penny, 0.01
Quarter, 0.25

3 个答案:

答案 0 :(得分:6)

您可以保留一个单独的哈希键数组,以便您可以编写

my @coins = qw/ Quarter Dime Nickel Penny HalfDollar /;

for my $key (@coins) {
  print "$key, $coins{$key}<br />\n";
}

或者你可以安装和使用Tie::IxHash模块,这将保持哈希元素的插入顺序,就像这样

use strict;
use warnings;

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

print "content-type: text/html \n\n";

%coins = (
  Quarter => 0.25,
  Dime    => 0.10,
  Nickel  => 0.05,
);

while (my ($key, $value) = each %coins){
    print "$key, $value<br />\n";
}

$coins{Penny} = .01;
$coins{HalfDollar} = .50;

print "<br />\n";
while (my ($key, $value) = each(%coins)){
     print "$key, $value<br />\n";
}

答案 1 :(得分:2)

默认哈希不保留顺序 - 这就是哈希的本质。您可以使用Tie::IxHash之类的模块来保留项目的添加顺序。

答案 2 :(得分:-1)

我提出了一个解决方案,无需使用Tie::IxHash

方法是在哈希的key之前添加一个字符/数字。

这将允许我们在keys sort编辑时获取我们在哈希中推送键的顺序。

以下是代码:

#!/usr/perl/bin -w    
use strict;
use Data::Dumper;

my %hash = ();

my @keys = qw(one two three);
my $count = 0;

for(my $i=0; $i<scalar(@keys); $i++) {
    $hash{ chr($count) . $keys[$i] } = 1;
    $count++;
}

foreach my $key (sort { ord $a <=> ord $b } keys(%hash) ) {
    print substr($key, 1) . " => " . $hash{$key}. "\n";
}