Как мне удалять хеш-элементы во время итерации?

У меня довольно большой хэш (около 10 миллионов ключей), и я хотел бы удалить некоторые элементы из

Обычно мне не нравится использовать delete или splice , и я заканчиваю копирование того, что хочу, вместо того, чтобы удалять то, что мне не нужно. Но на этот раз, поскольку хеш действительно большой, Думаю, мне хотелось бы удалить прямо из него.

Я делаю что-то вроде этого:

foreach my $key (keys %hash) {
 if (should_be_deleted($key)) {
  delete($hash{$key});
 }
}

И вроде работает нормально. Но ... что, если я хочу удалить некоторые элементы еще до их итерации? Я объясню на примере:

foreach my $key (keys %hash) {
 if (should_be_deleted($key)) {
  delete($hash{$key});
  # if $key should be deleted, so does "$key.a", "kkk.$key" and some other keys
  # I already know to calculate. I would like to delete them now...
 }
}

Я подумал о некоторых возможных решениях - например, проверить, существует ли еще ключ, в качестве первого шага в цикле или первого цикла и создания списка ключей для удаления (без фактического удаления их), затем на самом деле удаление в другом цикле.

Что вы думаете по этому поводу?

ОБНОВЛЕНИЕ

Кажется, что двухпроходный подход согласован. Однако это довольно неэффективно в том смысле, что во время первого прохода я дважды проверяю ключи, которые уже были помечены для удаления. Это вроде рекурсивно, потому что я не только проверяю ключ, я также вычисляю другие ключи, которые следует удалить, хотя они уже были рассчитаны по оригинальному ключу.

Возможно, мне нужно использовать более динамическую структуру данных для перебора ключей, которая будет обновляться динамически?

13
задан Brian Tompsett - 汤莱恩 11 July 2015 в 14:17
поделиться