У меня довольно большой хэш (около 10M ключей), и я хотел бы удалить из него некоторые элементы.
Я обычно не люблю использовать 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...
}
}
Я подумал о некоторых возможных решениях - например, проверка того, существует ли еще ключ в качестве первого шага в цикле или первый цикл, и создание списка ключей для удаления (без фактического удаления их), затем фактическое удаление в другом цикле.
Что вы думаете об этом?
UPDATE
Кажется, что подход с двойным проходом имеет консенсус. Однако это довольно неэффективно в том смысле, что во время первого прохода я перепроверяю ключи, которые уже были помечены для удаления. Это довольно рекурсивно, потому что я не только проверяю ключ, но и вычисляю другие ключи, которые следует удалить, хотя они уже были рассчитаны по первоначальному ключу.
Возможно, мне нужно использовать более динамическую структуру данных для перебора ключей, которая будет динамически обновляться?