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