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)

Другие вопросы по тегам