2012-08-16 10 views
5
my %myHash = (
    key1 => { 
     test1 => 1, 
     test2 => 2, 
    }, 
    key2 => { 
     test1 => 3, 
     test2 => 4, 
    }, 
); 

my $myRef = $myHash{ "key". ((~~keys %myHash) + 1) } //= { 
    test1 => 5, 
    test2 => 6, 
};  

ユーモアと私は上記が実際に実用的であると仮定します。この新しく作成されたキーを参照によってどのように削除できますか?明らかに Perlハッシュリファレンスによる基本キーの削除

delete $myRef; 

は動作しません

EDIT:だから、zostayから、私は以下のいる ...

sub deleteRef { 
    my ($hash_var, $hash_ref) = @_; 

    for (keys %$hash_var) { 
     delete $hash_var->{$_} if ($hash_var->{$_} == $hash_ref); 
    } 
} 

使用法:

deleteRef(\%myHash, $myRef); 

その方法は?まだ推奨されていませんか?

答えて

3

これは%myHash$myRefのすべての発生を削除します:あなたは、同じメモリアドレスを使用して参照をテストするために==を使用することができます

for my $key (keys %myHash) { 
    if ($myHash{$key} == $myRef) { 
     delete $myHash{$key}; 
    } 
} 

これは悪い考えですが、私はあなたを嫌っています。

+0

によって何を意味するかにかかっています私は多くの行のハッシュのハッシュにアクセスしているので、 'タイプ'を減らすためにハッシュキーへの参照を使用しています。サブルーチンについてどう思いますか? –

+0

サブは問題ありません。そのようなことはほぼ普遍的に改善されるので、参照の比較はお勧めしません。しかし、「より良い」という定義は議論の対象となり、解決しようとしている実際の問題の対象となります。実際の問題を知らなければ、私はよりよい解決策が何になるか分かりません。 – zostay

1

それは、そのリファレンスを探してハッシュをループする必要があります。または、将来の使用のためにデータ構造にキーを追加することもできます。

0

どのように新しいハッシュキーを生成していますか?

すべてのハッシュ値を直線的に検索して特定の参照を検索し、ハッシュが提供するはずの単純な高速アクセスをバイパスするのは悪いフォームです。

それはあなただけで

delete $myHash{$myKey}; 

行うことができた後

my $myKey = "key". ((~~keys %myHash) + 1); 
$myHash{$myKey} //= { 
    test1 => 5, 
    test2 => 6, 
}; 

と同等のものを書くためにはるかに意味をなすだろうが、すべてはあなたが本当にだから私は"key". ((~~keys %myHash) + 1)

関連する問題