Замена ключа Hash другим именем в perl

Я пытаюсь изменить ключ с другим именем. Пробовал код ниже, но получил ошибку:

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

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

Ошибка вывода: недопустимый нулевой модуль в строке 35 test.pl.


person user3854189    schedule 18.07.2014    source источник


Ответы (1)


Perl чувствителен к регистру. Вы ищете keys (нижний регистр):

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

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

Вы действительно должны use strict; use warnings; быть в верхней части всех ваших модулей/скриптов Perl. Это даст вам гораздо лучший обмен сообщениями об ошибках.

Что касается вашего вопроса, вы не можете обновлять такие хеш-ключи. Вы должны создать новый ключ в хэше с желаемым именем, а старый ключ удалить. Вы можете сделать это в одной строке, так как 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};
person Hunter McMillen    schedule 18.07.2014