Удаление из хэша

Проблема

Требуется удалить элемент из хэша, чтобы он не опознавался функцией keys, values или each. Например, если в хэше имена работников ассоциируются с окладами, после увольнения работника необходимо удалить его строку из хэша.

Решение

Воспользуйтесь функцией delete:
# Удалить $КЛЮЧ и ассоциированное значение из хэша %ХЭШ
delete($ХЭШ){$КЛЮЧ});

Комментарий

Многие ошибочно пытаются удалять элементы из хэша с помощью undef: undef ${ХЭШ{$КЛЮЧ} или $ХЭШ{$КЛЮЧ} = undef. В обоих случаях в хэше будет присутствовать элемент с ключом $КЛЮЧ и значением undef.
Функция delete — единственное средство для удаления конкретных элемейтов из хэша. Удаленный элемент не появится ни в списке keys, ни в итерациях each; функция exists возвращает для него ложное значение.
Следующий фрагмент демонстрирует отличия undef от delete:
# Хэш %food_color определяется во введении
sub print_foods {
  my @foods = keys %food_color;
  my $food;
  print "Keys: @foods\n";
  print "Values: ";
  foreach $food (@foods) {
    my $color = $food_color{$food};
    if (defined $color) {
      print "$color ";
    } else {
        print "(undef)";
	  }
  }
  print "\n";
}
print "Initially:\n";
print_foods();

print "\nWith Banana undef\n";
undef $food_color{"Banana"};
print_foods();

print "\nWith Banana deleted\n";
delete $food_color{"Banana"};
print_foods();

Initially:
Keys:  Banana  Apple  Carrot  Lemon
Values: yellow  red  orange  yellow

With  Banana  undef
Keys:  Banana  Apple  Carrot  Lemon
Values:  (undef)  red  orange  yellow

With  Banana  deleted
Keys:  Apple  Carrot  Lemon
Values:  red  orange  yellow
Как видите, после присвоения $food_color{"Banana"} = undef ключ "Banana" остается к хэше. Элемент не удаляется; просто мы присвоили ему undef. С другой стороны, функция delete действительно удалила данные из хэша — ключ "Banana" исчезает из списка, возвращаемого функцией keys.
Функция delete также может вызываться для среза хэша, это приводит к удалению всех указанных ключей:
delete @food_color{"Banana", "Apple", "Cabbage"};

См. также

Описание функций delete и keys



2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: