Perl Delete Base Key с помощью ссылки на хэш
my %myHash = (
key1 => {
test1 => 1,
test2 => 2,
},
key2 => {
test1 => 3,
test2 => 4,
},
);
my $myRef = $myHash{ "key". ((~~keys %myHash) + 1) } //= {
test1 => 5,
test2 => 6,
};
Забавьте меня и предположите, что вышеупомянутое действительно практично. Как я могу удалить этот вновь созданный ключ через ссылку?
delete $myRef;
Очевидно, не работает
РЕДАКТИРОВАТЬ: Итак, из zostay у меня есть следующее...
sub deleteRef {
my ( $hash_var, $hash_ref ) = @_;
for ( keys %$hash_var ) {
delete $hash_var->{$_} if ($hash_var->{$_} == $hash_ref);
}
}
Использование:
deleteRef(\%myHash, $myRef);
Как это? Все еще не рекомендуется?
3 ответа
Это удалит каждое вхождение $myRef
в %myHash
:
for my $key (keys %myHash) {
if ($myHash{$key} == $myRef) {
delete $myHash{$key};
}
}
Ты можешь использовать ==
проверить ссылки, используя тот же адрес памяти.
Я думаю, что это плохая идея, но я вас шучу.
Пока он стоит, вам придется перебирать хеш в поисках этой ссылки. Или вы можете добавить ключ к структуре данных для будущего использования.
Как вы на самом деле генерируете новый хэш-ключ?
Неправильно выполнять линейный поиск по всем значениям хеш-функции, чтобы найти конкретную ссылку, и обходить простой быстрый доступ, который должны обеспечивать хеши.
Было бы гораздо разумнее написать эквивалент
my $myKey = "key". ((~~keys %myHash) + 1);
$myHash{$myKey} //= {
test1 => 5,
test2 => 6,
};
после чего вы могли бы просто сделать
delete $myHash{$myKey};
но все зависит от того, что вы на самом деле подразумеваете под "key". ((~~keys %myHash) + 1)