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