2010-09-28 17 views
15

मैं अपने %hash को पूरी तरह से रीसेट करना चाहता हूं ताकि इसमें कुंजी या मान शामिल न हों। मैं लूप का उपयोग करने के बजाय एक लाइनर का उपयोग करना पसंद करता हूं।मैं लूप का उपयोग किये बिना पूरी तरह से हैश को रीसेट कैसे कर सकता हूं?

अब तक मैं कोशिश की है:

%hash = 0; 
%hash = undef; 

लेकिन इन दोनों सक्षम चेतावनी के साथ कठोर मोड में त्रुटियों फेंक, तो मैं पाश एक ही बात को प्राप्त करने के लिए एक सरल लिखा है:

for (keys %hash) { 
    delete $hash{$_}; 
} 

यह काम करता है लेकिन मैं वास्तव में एक लाइनर के साथ ऐसा करना चाहता हूं। क्या हैश को रीसेट करने का कोई तरीका है जिसे मैं देख रहा हूं?

+9

मैं चकित कोई पहले से ही अचानक सवाल है कि कर रहा हूँ के साथ काम करता लिए कहा। AFAICR मुझे कभी हैश को रीसेट करने की आवश्यकता नहीं थी क्योंकि पर्ल के साथ वास्तव में तंग स्कॉप्स हो सकते हैं। मैं बदले में चर के दायरे से बाहर निकलता हूं; यदि एक लूप में, शीर्ष के पास 'my' के साथ एक नया शब्दावली बनाया जाएगा। - मुझे लगता है कि यह एल्गोरिदमिक सुधार के लिए कमरे के साथ एक एक्सवाई समस्या है, शायद कुछ और संदर्भ दें? – daxim

+0

हैश एक वैश्विक है जिसे मैं सभी कार्यक्रमों और शेष के बाद अपने कार्यक्रम की शुरुआत के करीब बना देता हूं। यह अलग-अलग subroutines के साथ संशोधित किया जाता है जब तक कि मैं एक सरणी में अंतिम संस्करण असाइन नहीं करता। इस प्रवाह को देखते हुए, जब तक कि मुझे कुछ याद नहीं आ रहा है, मुझे विश्वास है कि इस विशेष हैश को 'रीसेट' करना आसान है, इसे सरणी में असाइन करने के बाद इसे 'मेरा' कथन के साथ पुन: बनाना है। (यह संभव है कि मैं एक एक्सवाई समस्या को देख रहा हूं क्योंकि मुझे नहीं पता था कि हैश को रीसेट करने जैसा कुछ कैसे करना है) – Structure

उत्तर

35

%hash =(); और undef %hash; दोनों काम करेंगे, इस अंतर के साथ कि बाद में अन्य चीजों के लिए उपयोग करने के लिए कुछ स्मृति वापस देगी। पूर्व स्मृति को पहले से इस्तेमाल किए गए हैश में रखेगा, मान लीजिए कि इसे बाद में फिर से इस्तेमाल किया जाएगा, जब हैश को फिर से भर दिया जा रहा है।

आप उस व्यवहार का पालन करने के Devel::Peek उपयोग कर सकते हैं:

$ perl -MDevel::Peek -we'my %foo = (0 .. 99); %foo =(); Dump \%foo; undef %foo; Dump \%foo' 
SV = IV(0x23b18e8) at 0x23b18f0 
    REFCNT = 1 
    FLAGS = (TEMP,ROK) 
    RV = 0x23acd28 
    SV = PVHV(0x23890b0) at 0x23acd28 
    REFCNT = 2 
    FLAGS = (PADMY,SHAREKEYS) 
    ARRAY = 0x23b5d38 
    KEYS = 0 
    FILL = 0 
    MAX = 63 
    RITER = -1 
    EITER = 0x0 
SV = IV(0x23b18e8) at 0x23b18f0 
    REFCNT = 1 
    FLAGS = (TEMP,ROK) 
    RV = 0x23acd28 
    SV = PVHV(0x23890b0) at 0x23acd28 
    REFCNT = 2 
    FLAGS = (PADMY,SHAREKEYS) 
    ARRAY = 0x0 
    KEYS = 0 
    FILL = 0 
    MAX = 7 
    RITER = -1 
    EITER = 0x0 

PVHV रों में MAX क्षेत्रों महत्वपूर्ण बिट कर रहे हैं।

+0

को संशोधित किया गया है अतिरिक्त अंतर्दृष्टि के लिए धन्यवाद। मैं उम्मीद करता हूं कि मेरे हैश में कभी भी वही मान नहीं होंगे जब इसे फिर से पॉप्युलेट किया जाता है, इसलिए मैं अपरिफ% हैश का उपयोग करूंगा; वाक्य - विन्यास। – Structure

+11

यह वास्तव में हैश में कौन से मूल्य संग्रहीत किए जाते हैं, लेकिन उनमें से कितने हैं।हैश में मूल्यों को संग्रहीत करने के लिए फिर से कुछ मेमोरी आवंटित करना, मुक्त करना, और फिर सबसे तेज़ चीज नहीं है, इसलिए पर्ल यह धारणा करता है कि अंततः एक हैश अपने मूल आकार में फिर से बढ़ेगा, भले ही इसे ' % h =() ', और हैश को आस-पास के कई तत्वों को स्टोर करने के लिए आवश्यक स्मृति को तब तक रखता है जब तक स्पष्ट रूप से ऐसा न करने के लिए कहा जाता है। यह हैश के भीतर आपके वास्तविक मूल्यों की स्मृति के साथ उलझन में नहीं है। – rafl

+0

अब मैं अंतर देखता हूं। ठीक है, मुझे देखने के लिए डेवेल :: पीक का उपयोग करना होगा जो मेरे उपयोग के मामले के लिए अधिक कुशल है। – Structure

2

उपयोग

%hash =(); 
+2

'मेरे' वहां के साथ, आप वास्तव में मौजूदा एक से संबंधित एक नया हैश बना रहे हैं, जो साफ़ नहीं कर रहे हैं पुराना हैश – cjm

+0

अब इसे – Thariama

7

आप क्या कर सकते हैं कैसे के बारे में

%hash =(); 
5

आप उपयोग कर सकते हैं undef:

undef %hash; 
0

काम करना चाहिए के बाद से ओपी एक एक लाइनर कि उपयोग सख्त और चेतावनी

delete $hash{$_} for (keys %hash) 
संबंधित मुद्दे

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