2

我有一个散列(HoH)的散列,我select_allhashref在 mysql 查询中使用它。该格式非常适合我想要的,并且我通过类似的方式还有另外两个 HoH。

我想最终将这些 HoH 合并在一起,唯一的问题(我认为)是一个 HoH 的“子哈希”中有一个键,它与另一个 HoH 中的一个键名相同。例如

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'角色。有任何想法吗?

4

2 回答 2

4

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

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}
}
于 2012-11-05T19:31:03.440 回答
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

Say we want they key of 'apples' to be 'c'. We cannot simply change the key to 'c', since the hash function always returns 02 for 'a', and will return something different for 'c'. So, if we want to change the key, we also have to move the value to the correct idx in the array/bucket.

Well, it might not be different, but that is a collision. Collisions are a special case that to be handled when implementing a hash.

For more info about on hashes:

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

How are hash tables implemented internally in popular languages?

于 2012-11-05T19:36:33.217 回答