如何对哈希的所有键进行特定更改?

Gra*_*e90 3 perl

我有一个像这样的哈希:

   'IRQ_VSAFE_LPM_ASC_0' => '140',
   'IRQ_VSAFE_LPM_ASC_1' => '141'.......and so on
Run Code Online (Sandbox Code Playgroud)

我想在散列中的所有键中用ASC_1替换ASC_.我试过这个:

foreach $_(keys $hash)   
{ 
s/ASC_/ASC_1/g; 
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

Сух*_*й27 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/ });
Run Code Online (Sandbox Code Playgroud)

  • @ Grace90它是一个[`foreach modifier`](http://perldoc.perl.org/perlsyn.html#Statement-Modifiers); 你也可以把它写成`for(@ k2){$ func - >()}`.`$ func`是一个匿名函数,作为第二个参数提供并对`$ _`进行操作,从而改变/替换`@ k2`数组的所有元素. (2认同)