3

私は perl プログラミングの初心者で、C から perl に適応するのに苦労しています。よろしくお願いします。

#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;

my %tgs;
$tgs{"0"}{"1"} = 01;
$tgs{"0"}{"2"} = 02;
$tgs{"0"}{"3"} = 03;
$tgs{"1"}{"1"} = 11;
$tgs{"1"}{"2"} = 12;
$tgs{"1"}{"3"} = 13;
$tgs{"2"}{"1"} = 21;
$tgs{"2"}{"2"} = 22;
$tgs{"2"}{"3"} = 23;


print Dumper(\%tgs);
exit(0);

o/p は

$VAR1 = {
          '1' => {
                   '1' => 11,
                   '3' => 13,
                   '2' => 12
                 },
          '0' => {
                   '1' => 1,
                   '3' => 3,
                   '2' => 2
                 },
          '2' => {
                   '1' => 21,
                   '3' => 23,
                   '2' => 22
                 }
        };

ハッシュ値は1,2,3の順で入力しています。しかし、私が印刷すると、注文は最初に1、次に0、次に2になります.なぜこのように起こっているのですか? これを制御できる方法はありますか?foreach0 1 2 3 の順序であると仮定してループでこのデータを読み取るため、制御する必要があります...

4

2 に答える 2

6

Perl は、ハッシュ内のキーの順序について何も保証しません。特定の順序で要素をループする必要がある場合は、次のことができます。

for (sort keys %myhash) {
    print Dumper($tgs{$_});
}

または、キーを簡単に並べ替えることができない場合は、マッピングで配列を使用する必要がある場合があります。

my %tgs;
$tgs{"0"}{"1"} = 01;
$tgs{"0"}{"2"} = 02;
$tgs{"0"}{"3"} = 03;
$tgs{"1"}{"1"} = 11;
$tgs{"1"}{"2"} = 12;
$tgs{"1"}{"3"} = 13;
$tgs{"2"}{"1"} = 21;
$tgs{"2"}{"2"} = 22;
$tgs{"2"}{"3"} = 23;

my @tag_keys = qw(1 2 3);

そして、次を使用します。

foreach (@tag_keys) {
    print Dumper($tgs{$_});
}
于 2013-11-12T07:47:12.080 に答える
2

あなたが発見したように、ハッシュは順不同です。C の「ハッシュ テーブル」に精通している場合、基本的には同じことです。キーはハッシュ関数を介して渡され、ハッシュ キーは最終的に結果のハッシュによって並べ替えられます。そして、ハッシュ関数が適切である場合 (そうである場合)、その順序は事実上ランダムです。さらに、Perl の最近のバージョンではランダム化関数が実装されているため、プログラムを実行するたびにハッシュ キーの順序が異なります。したがって、特定の順序を持​​つハッシュキーを本当に当てにすることはできません。

または、少なくともできません...デフォルトでは。

キーが挿入された順序を記憶するハッシュが長い間望まれていたため、誰かがTie::IxHashを発明しました。これは通常のハッシュと同じように機能しますが、キーの順序を示すために各キーに小さなメタデータも添付します。

于 2013-11-12T09:15:11.080 に答える