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

use*_*367 2 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 />";
}
Run Code Online (Sandbox Code Playgroud)

这给了

Nickel, 0.05
Dime, 0.1
Quarter, 0.25

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

Bor*_*din 6

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

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

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

或者您可以安装和使用该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";
}
Run Code Online (Sandbox Code Playgroud)