【问题标题】:Perl merge hashesPerl 合并哈希
【发布时间】:2014-04-16 22:45:16
【问题描述】:

是否可以像这样合并两个哈希:

%one = {
    name    => 'a',
    address => 'b'
};

%two = {
    testval => 'hello',
    newval  => 'bye'        
};

$one{location} = %two;

所以结束哈希看起来像这样:

%one = {
    name    => 'a',
    address => 'b',
    location => {
        testval => 'hello',
        newval  => 'bye'
    }
}

我看过但不确定是否可以在没有 for 循环的情况下完成。谢谢:)

【问题讨论】:

  • %hash = { key => value } 语法错误(你是use warnings 吗?)。 { ... } 定义了一个哈希引用。你要么想说%hash = ( key => value , ... )要么$hashref = { key => value, ... }
  • 您的外部 {} 应该是 ()s。 () 生成哈希,{} 生成哈希引用。

标签: perl hash hashref


【解决方案1】:

由于散列元素的值是标量,因此无法将散列存储在散列中,但可以将 reference 存储到散列。 (存储数组和存储到数组中也是如此。)

my %one = (
   name    => 'a',
   address => 'b',
);

my %two = (
   testval => 'hello',
   newval  => 'bye',     
);

$one{location} = \%two;

一样
my %one = (
   name    => 'a',
   address => 'b',
   location => {
      testval => 'hello',
      newval  => 'bye',
   },
);

【讨论】:

  • 应该说不是标量
  • @Hunter McMillen,不。就像我说的,它们标量,这就是为什么你不能在其中存储散列或数组的原因。
  • 之前的措辞让我失望了,我明白你现在的意思了。
【解决方案2】:

如果你使用

$one{location} = \%two

那么你的哈希值将包含一个引用来哈希%two,这样如果你用$one{location}{newval} = 'goodbye'之类的东西修改它,那么%two也将被更改。

如果您想要%two 中数据的单独副本,那么您需要编写

$one{location} = { %two }

之后%one的内容独立于%two,可以单独修改。

【讨论】:

  • { %two } 很少需要,因为my %two; 的正确放置通常会在需要时处理创建新哈希。
猜你喜欢
  • 2012-04-28
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 2021-11-28
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多