Ho un hash abbastanza grande (alcune chiavi da 10 M) e vorrei eliminare alcuni elementi da esso.Come si eliminano gli elementi hash durante l'iterazione?
Di solito non mi piace usare delete
o splice
, e finisco per copiare quello che voglio invece di cancellare quello che non faccio. Ma questa volta, dato che l'hash è molto grande, penso che mi piacerebbe cancellarlo direttamente da esso.
così sto facendo qualcosa di simile:
foreach my $key (keys %hash) {
if (should_be_deleted($key)) {
delete($hash{$key});
}
}
e sembra funzionare bene. Ma ... e se mi piacerebbe cancellare alcuni elementi prima ancora di iterarli? Mi spiego con l'esempio:
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...
}
}
ho pensato di alcune possibili soluzioni - come controllare se una chiave esiste ancora come il primo passo per il ciclo o il primo looping e la creazione di un elenco di chiavi da cancellare (senza in realtà l'eliminazione loro), quindi effettivamente cancellando in un altro ciclo.
Cosa ne pensi di questo?
UPDATE
E 'sembra che l'approccio di un passaggio doppio ha un consenso. Tuttavia, è abbastanza inefficiente nel senso che durante il primo passaggio ho ricontrollato le chiavi che erano già state contrassegnate per la cancellazione. Questo è un po 'ricorsivo, perché non solo controllo la chiave, ma calcolerò anche le altre chiavi che dovrebbero essere cancellate, sebbene fossero già calcolate dalla chiave originale.
Forse ho bisogno di usare qualche altra struttura dati dinamica per iterare sui tasti, che verrà aggiornata dinamicamente?
*** "I tasti di doppio controllo che erano già contrassegnati per la cancellazione "*** vedi la mia soluzione per un'alternativa frugale – Borodin