【问题标题】:Can I rename a hash key inside another hash in Perl?我可以在 Perl 的另一个散列中重命名散列键吗?
【发布时间】:2012-10-25 15:45:47
【问题描述】:

我有一个哈希值 (HoH),它是通过在 mysql 查询上使用 select_allhashref 得到的。 该格式非常适合我想要的,并且我通过类似的方式还有另外两个 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' 部分。有什么想法吗?

【问题讨论】:

    标签: perl hash-of-hashes


    【解决方案1】:

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

    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}
    }
    

    【讨论】:

      【解决方案2】:

      由于散列的实现方式,您必须使用 $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
      

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

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

      有关哈希的更多信息:

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

      How are hash tables implemented internally in popular languages?

      【讨论】:

      • 一个很好的解决方案和很好的解释+1。重命名列更容易,但如果它不起作用,那么我会使用它。
      猜你喜欢
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 2021-02-04
      • 2023-03-22
      • 2014-10-23
      • 1970-01-01
      相关资源
      最近更新 更多