perl - 散列哈希 - 元素是如何存储的?

mk.*_*k.. 3 perl

我是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);
Run Code Online (Sandbox Code Playgroud)

o/p是

$VAR1 = {
          '1' => {
                   '1' => 11,
                   '3' => 13,
                   '2' => 12
                 },
          '0' => {
                   '1' => 1,
                   '3' => 3,
                   '2' => 2
                 },
          '2' => {
                   '1' => 21,
                   '3' => 23,
                   '2' => 22
                 }
        };
Run Code Online (Sandbox Code Playgroud)

我已按1,2,3的顺序输入哈希值.但是当我打印订单时,先是1然后是0然后是2.为什么会这样呢?有什么方法可以控制这个吗?我需要控制它,因为我将在foreach循环中读取此数据,假设它的顺序为0 1 2 3 ...

Nat*_*man 6

Perl不保证散列中键的顺序.如果必须按特定顺序循环遍历元素,则可以执行以下操作:

for (sort keys %myhash) {
    print Dumper($tgs{$_});
}
Run Code Online (Sandbox Code Playgroud)

或者,如果键不容易排序,则可能需要使用带有映射的数组:

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);
Run Code Online (Sandbox Code Playgroud)

然后使用:

foreach (@tag_keys) {
    print Dumper($tgs{$_});
}
Run Code Online (Sandbox Code Playgroud)