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