5
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);

どのようだ?まだお勧めしませんか?

4

3 に答える 3

3

$myRefこれにより、 inのすべての出現が削除され%myHashます。

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

==同じメモリアドレスを使用して参照をテストするために使用できます。

これは悪い考えだと思いますが、冗談を言っています。

于 2012-08-16T15:44:55.147 に答える
1

現状では、その参照を探してハッシュをループする必要があります。または、将来の使用のためにデータ構造にキーを追加することもできます。

于 2012-08-16T15:47:11.770 に答える
0

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

特定の参照を見つけるためにすべてのハッシュ値を直線的に検索し、ハッシュが提供するはずの単純な高速アクセスをバイパスするのは不適切な形式です。

同等のものを書く方がはるかに理にかなっています

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

その後、あなたはただすることができます

delete $myHash{$myKey};

しかし、すべてはあなたが本当に意味するものにかかっています"key". ((~~keys %myHash) + 1)

于 2012-08-16T21:49:45.073 に答える