3

HASH を 1 つずつトラバースしたいのですが。ランダムな方法ではありません。何か案が。たとえば、私はこのようなハッシュファイルを持っています...

our %HASH = (
'rajesh:1700'  =>  Bangalore,
'rajesh:1730'  =>  Delhi,
'rajesh:1770'  =>  Ranchi,
'rajesh:1780'  =>  Mumbai,
'rajesh:1800'  =>  MYCITY,
'rajesh:1810'  =>  XCF,
);

同じ方法で印刷する必要があります。以下で試しましたが失敗しました。何か案は?

while ( my $gPort = each %HASH)
{
    print "$gPort\n";
}


for my  $gPort ( keys %HASH )
{
    print "$gPort\n";
}
4

4 に答える 4

4

質問のキーが与えられた場合、ソートコンパレータを変更するだけで目的の出力が得られます。

for my $gPort (sort keys %HASH) {
  print "$gPort => $HASH{$gPort}\n";
}

注:上記のコードは、キーのすべての数字が同じ位置にあり、同じ長さであると想定しています。たとえば、rajesh:001775キーは1770年から1780年の間ではなく、最初に出てきます。

于 2012-04-05T12:26:50.133 に答える
1

値(キーではなく)で並べ替えて、ハッシュをソートして出力できます。

for my $gPort (sort { $HASH{$a} <=> $HASH{$b} } keys %HASH) {
  print "$gPort => $HASH{$gPort}\n";
}
于 2012-04-05T12:55:38.923 に答える
0

要素の挿入順序をハッシュに保持したい場合は、Tie::IxHashがツールになる可能性があります。使い方はとても簡単です。

簡単な例を示します。

    use Tie::IxHash;        
    tie my %days_in => 'Tie::IxHash',
            January   => 31,
            February  => 28,
            March     => 31,
            April     => 30,
            May       => 31,
            June      => 30,
            July      => 31,
            August    => 31,
            September => 30,
            October   => 31,
            November  => 30,
            December  => 31;       


      print join(" ", keys %days_in), "\n";        
    # prints: January February March April May June July August
    # September October November December
于 2012-04-05T13:43:56.237 に答える
0

Data::Dumperを見てください。特に、 を設定$Data::Dumper::Sortkeysすると、ソートされた順序でダンプが取得されます。

例として:

use Data::Dumper;
$Data::Dumper::Sortkeys = 1;

my %some_hash;

# code to populate hash
[ . . . ]

print Dumper(\%some_hash);

もちろん、これはハッシュを単純にダンプしたい場合にのみ機能します。印刷を他の形式で行いたい場合は、次のようにキーを並べ替えて印刷するだけです。

foreach my $key (sort keys %some_hash) {
    print "[KEY]: $key; [VAL]: $some_hash{$key}\n";
}
于 2012-04-05T13:26:18.273 に答える