2

是否可以以 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 />";
}

这给

镍,0.05
一角钱,0.1
季度,0.25

镍,0.05
一角钱,0.1
半美元,0.5
一分钱,0.01
季度,0.25
4

3 回答 3

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";
}
于 2013-02-19T10:25:04.130 回答
2

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

于 2013-02-19T10:18:31.290 回答
-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";
}
于 2013-02-19T11:16:53.797 回答