2012-06-01 9 views
7

मैं मूल रूप से ऐसा करना चाहते हैं:क्या यह हैश संदर्भ से एक कुंजी को हटाने के लिए पर्ल में सुरक्षित है जब मैं एक ही हैश पर लूप करता हूं? और क्यों?

foreach my $key (keys $hash_ref) { 

    Do stuff with my $key and $hash_ref 

    # Delete the key from the hash 
    delete $hash_ref->{$key}; 
} 

यह सुरक्षित है? और क्यों?

उत्तर

15

आप हैश से अधिक पुनरावृत्ति नहीं कर रहे हैं, तो आप keys द्वारा दिया कुंजियों की सूची पर पुनरावृत्ति कर रहे हैं इससे पहले कि आप भी पाशन क्योंकि

for my $key (keys %$hash_ref) { 
    ... 
} 

लगभग एक ही

रूप
my @anon = keys %$hash_ref; 
for my $key (@anon) { 
    ... 
} 

है शुरू कर दिया हैश से हटने से कोई समस्या नहीं होती है।


each, दूसरे पर, एक हैश से अधिक पुनरावृति करता है। प्रत्येक बार इसे कॉल किया जाता है, each एक अलग तत्व देता है। फिर भी, यह अभी भी delete वर्तमान तत्व के लिए सुरक्षित है!

# Also safe 
while (my ($key) = each(%$hash_ref)) { 
    ... 
    delete $hash_ref->{$key}; 
    ... 
} 

आप जोड़ सकते हैं या जब यह खत्म हो पुनरावृत्ति, प्रविष्टियों छोड़ दिया था या दोहराया जा सकता है एक हैश के तत्वों को हटाते हैं - ताकि ऐसा नहीं करते हैं। अपवाद: हाल ही में प्रत्येक()

+0

शब्द "वर्तमान कार्यान्वयन में" शब्द मुझे थोड़ा डराता है, क्योंकि ऐसा लगता है कि कार्यान्वयन को बदलने के लिए वहां जगह है जैसे कि यह है अब सुरक्षित नहीं है। मैं उस पर भरोसा नहीं करता, लेकिन फिर मैं 'प्रत्येक()' का उपयोग नहीं करता - foreach कुंजी ठीक है। – LeoNerd

+0

@LeoNerd, पुराना पर्ल (कम से कम 5.10) बस "हमेशा हटाना सुरक्षित है ..." स्पष्ट संगतता कारणों के लिए, मुझे संदेह है कि यह कभी भी 'उपयोग सुविधा' या अन्य समान प्रगति को शुरू किए बिना बदला जाएगा। –

+1

जिन्होंने "वर्तमान कार्यान्वयन में" जोड़ा? यह हमेशा वहां नहीं था, और अब वहां नहीं होना चाहिए, जब तक कि वास्तव में वास्तव में कोई अच्छा कारण न हो। अद्यतन: अब और प्रतीत नहीं होता है। – ysth

3

यह सुरक्षित है, क्योंकि keys %hash पुन: प्रारंभ करने से पहले, एक बार पूरी सूची प्रदान करता है। foreach फिर इस पूर्व-जेनरेट की गई सूची पर काम करना जारी रखता है, इससे कोई फर्क नहीं पड़ता कि आप वास्तविक हैश के अंदर क्या बदलते हैं।

हालांकि यह आपकी याददाश्त खाता है, क्योंकि आप पूरी सूची तब तक रखते हैं जब तक आप नहीं कर लेते।

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

  • कोई संबंधित समस्या नहीं^_^