我有一个像这样的哈希:
'IRQ_VSAFE_LPM_ASC_0' => '140',
'IRQ_VSAFE_LPM_ASC_1' => '141'.......and so on
我想在散列中的所有键中用ASC_1替换ASC_。我试过这个:
foreach $_(keys $hash)
{
s/ASC_/ASC_1/g;
}
但它不起作用。
答案 0 :(得分:15)
您必须从哈希中删除旧密钥并插入新密钥,
use strict;
use warnings;
sub rename_keys {
my ($hash, $func) = @_;
my @k1 = my @k2 = keys %$hash;
$func->() for @k2;
@$hash{@k2} = delete @$hash{@k1};
}
my %hash = (
'IRQ_VSAFE_LPM_ASC_0' => '140',
'IRQ_VSAFE_LPM_ASC_1' => '141',
);
rename_keys(\%hash, sub { s/ASC_/ASC_1/ });
答案 1 :(得分:2)
之前的回答解决了一种做你想做的事情的方法。但是,解释为什么你试图做的事情也没有用。
问题是Perl中用于处理哈希的语法可能会误以为它与哈希在其下工作的实际方式相比具有简单性。
您在Perl代码中看到的只是两条信息:哈希键和相应的哈希值:$myHash{$key} = $value;
或甚至更具误导性%myHash = ($key => $value);
然而,哈希的工作方式,这不仅仅是将密钥和值存储为一对,因为上面的代码可能会引导您思考。相反,散列是一种复杂的数据结构,其中密钥作为寻址的输入,通过公式(散列函数)和算法(处理碰撞)完成 - 详细信息在{{3 }}。
因此,将哈希键更改为仅仅是一个值是不够的,因为存储在哈希中的内容不仅仅是一个值 - 它是一个基于该值进行寻址的整个数据结构。因此,当您更改散列键时,它也会更改数据结构中值的位置,如果不删除旧条目并在新键下添加全新条目,则会执行此操作,这将删除并重新输入 - 将值插入正确的位置。
答案 2 :(得分:2)
执行此操作的简单方法可能是使用最近pairmap
中的List::Util
。
use 5.014; # so we can use the /r flag to s///
use List::Util qw( pairmap );
my %new = pairmap { ($a =~ s/ASC_/ASC_1/r) => $b } %oldhash;