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
10セント硬貨、0.1
四半期、0.25

ニッケル、0.05
10セント硬貨、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、ハッシュの前に文字/数字を追加することです。

これにより、 edに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 に答える