3

次のハッシュを検討してください:

my $hoh = {
'tag1' => {
    'name' => 'Item 1',
    'order' => '1',
    'enabled' => '1',
},
'tag2' => {
    'name' => 'Item 2',
    'order' => '2',
    'enabled' => '0',
},
'tag3' => {
    'name' => 'Item 3',
    'order' => '3',
    'enabled' => '1',
},

}

私はハッシュ値を取得するために以下を使用しています:

for my $x (keys %{ $hoh{'tag1'} }) {
            my $y = $hoh{'tag1'}{$x};
            print "key is $x --- value is $y\n";
            }

しかし、出力はキーが保存された順序ではありません! キーと値のペアが保存された順序で出力されることを確認することは可能ですか?

4

3 に答える 3

2

キーが格納される「順序」はありません。ハッシュです。特定の順序 (表の見出しなど) が本当に必要な場合は、別のリストを保持してください。

my @table_headings = qw(name order enabled);
for my $k (@table_headings) {
    my $v = $hoh->{tag1}->{$k};
    print "$k => $v\n";
}
于 2013-05-31T06:16:34.043 に答える
2

Perl ハッシュは、ハッシュの定義に使用した順序を保存しません。Tie::IxHashモジュールを使用できます。

ハッシュのハッシュがあることがわかりましたので、使用しているハッシュごとに Tie::Hash を使用する必要があります (同じ順序でサブハッシュが必要な場合)、 $hoh ハッシュだけでなく、ネストされたハッシュも各キーに。

use Tie::IxHash;
my %hoh = ();
tie %hoh, 'Tie::IxHash';

$hoh{'tag1'} = Tie::IxHash->new('name'=>'Item 1', 'order'=>'1', 'enabled'=>'1');
#...
于 2013-05-31T06:17:08.283 に答える
1

プレーンハッシュはキーを特定の順序で保存しないため、関連付けられたハッシュが必要になります。 http://perldoc.perl.org/functions/keys.html

use Tie::IxHash;
my $hoh = {};
tie %$hoh, 'Tie::IxHash';

%$hoh = (
  'tag1' => {
      'name' => 'Item 1',
      'order' => '1',
      'enabled' => '1',
  },
  'tag2' => {
      'name' => 'Item 2',
      'order' => '2',
      'enabled' => '0',
  },
  'tag3' => {
      'name' => 'Item 3',
      'order' => '3',
      'enabled' => '1',
  },
);
于 2013-05-31T06:16:00.887 に答える