我可以在Perl中的另一个哈希中重命名哈希键吗?

时间:2012-11-05 18:45:02

标签: perl hash-of-hashes

我在mysql查询中使用select_allhashref获得了散列哈希(HoH)。 格式非常适合我想要的东西,我有两个其他的HoH通过类似的方式。

我想最终将这些HoH合并在一起,我唯一的问题(我认为)是在一个HoH的'sub-hash'中有一个键与另一个HoH中的一个同名。 E.g。

my $statement1 = "select id, name, age, height from school_db";
my $school_hashref = $dbh->selectall_hashref($statement1, 1);

my $statement2 = "select id, name, address, post_code from address_db";    
my $address_hashref = $dbh->selectall_hashref($statement2, 1);

所以当我转储数据时,我会得到如下结果:

$VAR1 = {
          '57494' => {
                       'name' => 'John Smith',
                       'age' => '9',
                       'height' => '120'
                     }
        }
};
$VAR1 = {
          '57494' => {
                       'name' => 'Peter Smith',
                       'address' => '5 Cambridge Road',
                       'post_code' => 'CR5 0FS'
                     }
        }
};

(这是一个例子,因此拥有不同的名字似乎不合逻辑,但我需要它:))

所以我想将'name'重命名为'address_name'等。这可能吗?我知道你可以做到

$hashref->{$newkey} = delete $hashref->{$oldkey};

(编辑:这是我在网上找到的一个例子,但尚未经过测试。)

但我不知道我将如何代表'id'部分。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

不知道将它们合并在一起的方式,最简单的解决方案可能是简单地更改select语句以重命名结果中的列。而不是试图在之后操纵哈希。

my $statement2 = "select id, name as address_name, address, post_code from address_db";    
my $address_hashref = $dbh->selectall_hashref($statement2, 1);

如果这对您来说不是一个现实的选择,那么循环可能是您的最佳选择

foreach (keys %{$address_hashref}) {
  $address_hashref->{$_}{$newkey} = delete $address_hashref->{$_}{$oldkey}
}

答案 1 :(得分:3)

您已经使用$hashref->{$newkey} = delete $hashref->{$oldkey};执行此操作,因为实现了哈希方式。

你也可以用哈希哈希来做。

$hashref->{$key_id}{$newKey} = delete $hashref->{$key_id}{$oldKey};

哈希函数用于将密钥转换为数组元素(槽或桶)的索引(哈希),其中要搜索相应的值。

这是一个简单的例子:

我们的哈希

{
   'a' => "apples",
   'b' => "oranges"
}

让我们定义哈希函数idx = h(key)并使用上面的键上的函数给出:

h('a') = 02;
h('b') = 00;

如何将其存储在数组或存储桶中

idx  | value
00   | 'oranges'
01   | ''
02   | 'apples'
03   | ''
... and so on

假设我们希望'苹果'的关键是'c'。我们不能简单地将键更改为'c',因为哈希函数总是为'a'返回02,并且将为'c'返回不同的值。因此,如果我们想要更改密钥,我们还必须将值移动到数组/存储桶中的正确idx。

嗯,它可能没有什么不同,但这是一次碰撞。冲突是实现哈希时要处理的特殊情况。

有关哈希的更多信息:

http://en.wikipedia.org/wiki/Hash_table

How are hash tables implemented internally in popular languages?