用perl中的其他名称替换哈希键

时间:2014-07-18 19:19:08

标签: perl hash substitution

我正在尝试使用其他名称更改密钥。尝试下面的代码,但得到一些错误:

my @array = qw(1 hello ue hello 3 hellome 4 hellothere);
my %hash = @array;

foreach (Keys %hash) { 
   s/ue/u/g;
}

输出错误:test.pl第35行的非法模数为零。

1 个答案:

答案 0 :(得分:6)

Perl区分大小写。您正在寻找keys(小写):

my @array = qw(1 hello ue hello 3 hellome 4 hellothere);
my %hash = @array;

foreach (keys %hash) {  # <-- 
   s/ue/u/g;
}

您应该在所有Perl模块/脚本的顶部use strict; use warnings;。它将为您提供更好的错误消息。

更重要的是,您无法像这样更新哈希键。您必须使用所需名称在哈希中创建新密钥,并删除旧密钥。您可以在一行中很好地完成此操作,因为delete返回已删除的哈希键的值。

use strict;
use warnings; 

my @array = qw(1 hello ue hello 3 hellome 4 hellothere);
my %hash = @array;

foreach my $key (keys %hash) {  # <-- 
   if ($key eq 'ue') {
      $hash{u} = delete $hash{$key};
   }
}

为了进一步收紧代码,实际上并不需要遍历密钥来确定是否存在特定密钥。以下单行可以替换for循环:

$hash{u} = delete $hash{ue} if exists $hash{ue};