2009-09-29 45 views
16

让我们说,如果我有这样的哈希:如何替换Perl哈希键?

$data = { 
    'key1' => { 
       'key2' => 'value1' 
       }, 
    'key3' => { 
       'key4' => { 
          'key5' => 'value2' 
          } 
       }, 
    }; 

现在,我怎么能取代一些其他的键名关键“KEY5”说“键6”?我知道如何循环散列值&,但我不知道如何替换键或值。谢谢你的帮助。

回答

40

delete运算符返回正在删除的值。所以这

$data->{key3}{key4}{key6} = delete $data->{key3}{key4}{key5} 

会做你想要的。

+0

哦,对!我忘了那个。关闭修改我的'hash_replace()' – 2009-09-29 03:06:40

+0

谢谢你。我甚至不知道有可能这样做 – John 2009-09-29 17:51:44

9

你不能取代它,但你可以很容易地使一个新的密钥,然后delete()老一:

$data->{key3}{key4}{key6} = $data->{key3}{key4}{key5}; 
delete $data->{key3}{key4}{key5}; 

当然,你可以做一个非常简单的子程序来做到这一点。但是,我的第一种方法是错误的,并且您需要制作一个更复杂的方法来传递数据结构以修改元素并将其修改,并且假设您想要几个级别的元素,这可能很困难。但如果你不介意有点混乱:

sub hash_replace (\%$$) { 
    $_[0]->{$_[2]} = delete $_[0]->{$_[1]}; # thanks mobrule! 
} 

然后调用它:

hash_replace %{$data->{key3}{key4}}, "key5", "key6"; 

还是冷静的方式(如何更好地说,我们正在改变“KEY5”到“键6” ?):

hash_replace %{$data->{key3}{key4}}, key5 => "key6"; 

(测试和工程)

+0

任何理由一downvote?在这里有没有工作? – 2009-09-29 05:07:59

+0

这太好了,谢谢你的帮助。这个例子对我来说理解如何解决这个问题真的很好。 – John 2009-09-29 17:51:09

0

这个 '作品',但非常硬编码。

#!/bin/perl -w 
use strict; 

my $data = { 
    'key1' => { 
     'key2' => 'value1' 
    }, 
    'key3' => { 
     'key4' => { 
      'key5' => 'value2' 
     } 
    }, 
}; 

print "$data->{key3}->{key4}->{key5}\n"; 

my $save = $data->{key3}->{key4}->{key5}; 
delete $data->{key3}->{key4}->{key5}; 
$data->{key3}->{key4}->{key6} = $save; 

print "$data->{key3}->{key4}->{key6}\n"; 

可以消除“ - >”哈希标之间的运营商,而不是一前一后“$数据” - 在克里斯·鲁茨的解决方案。

+0

我总是倾向于使用最少数量的' - >',我可以逃避,但是我可以看到它很快就会变得毛茸茸的。 – 2009-09-29 03:09:57

1

可以使用YAML深潜入你的哈希用一个简单的正则表达式:

use YAML::XS; 
my $yaml = Dump $hash; 
$yaml =~ s/key5/key6/; # may wish for global sub 
$hash = Load $yaml;