2012-08-16 11 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, 
};  

मुझे हास्य करें और ऊपर मान लीजिए वास्तव में व्यावहारिक है। संदर्भ के माध्यम से मैं इस नव निर्मित कुंजी को कैसे हटा सकता हूं?पर्ल हैश संदर्भ

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

यह %myHash में $myRef के हर घटना को नष्ट करेगा:

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

आप == उपयोग कर सकते हैं एक ही स्मृति पते का उपयोग कर संदर्भ के लिए परीक्षण करने के लिए।

मुझे लगता है कि यह एक बुरा विचार है, लेकिन मैं आपको हास्य कर रहा हूं।

+0

तो मेरा मतलब है पर टिका 'टाइपेज' को कम करने के लिए हैश कुंजी के संदर्भ का उपयोग कर रहा हूं क्योंकि मैं कई लाइनों पर हैश के हैश तक पहुंच रहा हूं। आप subroutine के बारे में क्या सोचते हैं? –

+0

सब ठीक है। मैं संदर्भ तुलना करने की अनुशंसा नहीं करता क्योंकि ऐसी चीजें लगभग सार्वभौमिक रूप से हल हो सकती हैं। हालांकि, "बेहतर" की परिभाषा बहस के लिए विषय है और वास्तविक समस्या जिसे आप हल करने की कोशिश कर रहे हैं। वास्तविक समस्या को जानने के बिना, मुझे नहीं पता कि एक बेहतर समाधान क्या होगा। – zostay

1

जैसा कि यह खड़ा है कि आपको उस रेफ की तलाश में हैश के माध्यम से लूप करना होगा। या आप भविष्य के उपयोग के लिए डेटा संरचना में वें कुंजी जोड़ सकते हैं।

0

आप वास्तव में नई हैश कुंजी उत्पन्न कर रहे हैं?

किसी विशेष संदर्भ को खोजने के लिए सभी हैश मानों के माध्यम से रैखिक रूप से खोजना और हैश को प्रदान करने वाली सरल तेज़ पहुंच को छोड़कर यह खराब रूप है।

यह भी बहुत कुछ मतलब होगा

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

जिसके बाद आप सिर्फ

delete $myHash{$myKey}; 

कर सकता है के बराबर लिखने के लिए लेकिन सब कुछ आप वास्तव में क्या द्वारा "key". ((~~keys %myHash) + 1)

संबंधित मुद्दे