2012-11-05 79 views
2

我有一个哈希值(HoH),我在使用mysql查询时使用了select_allhashref。 格式对于我想要的是完美的,我有两个类似的手段HoH。我可以在Perl的另一个哈希中重命名哈希键吗?

我想最终将这些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

不知道将它们合并在一起的方式,最简单的解决方案可能是简单地更改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} 
} 
+0

是完美的。好人! – dgBP

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?

+0

一个很好的解决方案和很好的解释+1。重命名列更容易,但如果它不起作用,那么我会使用它。 – dgBP