我在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'
部分。有什么想法吗?
答案 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?