Mam dość duże hash (niektóre klucze 10M) i chciałbym usunąć niektóre elementy z niego.Jak powinienem usunąć elementy mieszające podczas iteracji?
Zwykle nie lubię korzystać z delete
lub splice
i kończę kopiowanie tego, co chcę zamiast usuwania tego, czego nie chcę. Ale tym razem, ponieważ hash jest naprawdę duży, myślę, że chciałbym usunąć bezpośrednio z niego.
Więc robię coś takiego:
foreach my $key (keys %hash) {
if (should_be_deleted($key)) {
delete($hash{$key});
}
}
I wydaje się działać OK. Ale ... co jeśli chciałbym usunąć niektóre elementy, nawet przed ich iteracją? Wytłumaczę na przykładzie:
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...
}
}
myślałem o kilku możliwych rozwiązań - takich jak sprawdzenie, czy klucz istnieje nadal jako pierwszy krok w pętli lub pierwszej pętli i tworząc listę kluczy do usunięcia (bez faktycznie usuwanie ich), a następnie kasowanie w innej pętli.
Co sądzisz o tym?
UPDATE
To wydaje się, że podejście double-pass ma konsensusu. Jest to jednak dość nieefektywne w tym sensie, że podczas pierwszego przejścia podwójnie sprawdzam klucze, które zostały już oznaczone do skasowania. Jest to rekurencyjne, ponieważ nie tylko sprawdzam klucz, ale także obliczam inne klucze, które powinny zostać usunięte, mimo że zostały już obliczone przez oryginalny klucz.
Być może potrzebuję użyć bardziej dynamicznej struktury danych do iteracji kluczy, która będzie aktualizowana dynamicznie?
*** "Ja klucze dokładnie sprawdzić które zostały już oznaczone do skasowania "*** zobacz moje rozwiązanie dla oszczędnej alternatywy – Borodin