【问题标题】:perl - Hash in hash - how are elements stored?perl - 散列中的散列 - 如何存储元素?
【发布时间】:2013-11-24 06:27:01
【问题描述】:

我是 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。为什么会这样?有什么办法可以控制吗?我需要控制它,因为我将在 foreach 循环中读取这些数据,假设它的顺序是 0 1 2 3...

【问题讨论】:

标签: perl


【解决方案1】:

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{$_});
}

【讨论】:

  • 谢谢。这是信息丰富的。对于我的prblm,我使用'for' 而不是像$tgs{i}{j} 这样的“foreach”。 :) 要在我的实际任务中使用数组和哈希,我需要更多的练习。感谢您的解决方案
  • 在 Perl 中,forforeach 可以互换。
【解决方案2】:

正如您所发现的,哈希是无序的。如果您熟悉 C 中的“哈希表”,那么它本质上是相同的——键通过哈希函数传递,哈希键最终按生成的哈希排序。如果散列函数有任何好处(确实如此),那么该顺序实际上是随机的。此外,最近版本的 Perl 已经实现了随机化功能,这将导致每次程序运行时散列键的顺序都不同。所以你真的,真的不能指望具有任何特定顺序的哈希键。

或者至少你不能……默认情况下。

长期以来,人们一直希望哈希能够记住插入键的顺序,因此有人发明了Tie::IxHash,它的作用就像常规哈希一样,只是它还在每个键上附加了一些元数据来指示它们的顺序。

【讨论】:

    猜你喜欢
    • 2013-12-30
    • 2013-02-05
    • 2015-07-17
    • 2011-03-13
    • 2016-07-18
    • 2016-08-03
    • 1970-01-01
    • 2014-01-16
    • 2013-03-14
    相关资源
    最近更新 更多