आइए कहें कि मेरे पास एक बड़ा हैश है और मैं इसकी सामग्री की सामग्री पर पुन: प्रयास करना चाहता हूं। मानक मुहावरा कुछ इस तरह होगा:क्या हैश संदर्भ पर पुनरावृत्त करने के लिए इसे पूरी तरह से perl में कॉपी करना आवश्यक है?
while(($key, $value) = each(%{$hash_ref})){
///do something
}
हालांकि, अगर मैं समझता हूँ कि मेरी पर्ल सही ढंग से यह वास्तव में दो बातें कर रही है। सबसे पहले
%{$hash_ref}
सूची संदर्भ में रेफरी का अनुवाद कर रहा है। इस प्रकार
(key1, value1, key2, value2, key3, value3 etc)
जैसे कुछ लौटने पर मेरी स्टैक्स मेमोरी में संग्रहीत किया जाएगा। फिर प्रत्येक विधि चल जाएगी, स्मृति में पहले दो मानों को खाएं (key1 & value1) और प्रक्रिया के लिए उन्हें मेरे समय लूप पर लौटाना।
यदि मेरी समझ यह सही है कि इसका मतलब है कि मैंने अपने पूरे हैश को मेरी स्टैक्स मेमोरी में प्रभावी रूप से प्रतिलिपि बनाई है, तो केवल नई प्रतिलिपि को फिर से चालू करने के लिए, जो कि बड़े हैश के लिए महंगा हो सकता है, क्योंकि इसे फिर से शुरू करने की कीमत के कारण सरणी दो बार, लेकिन संभावित कैश हिट के कारण भी अगर दोनों हैंश को स्मृति में एक बार में नहीं रखा जा सकता है। यह बहुत अक्षम लगता है। मैं सोच रहा हूं कि क्या वास्तव में ऐसा होता है, या यदि मैं या तो वास्तविक व्यवहार को गलत समझ रहा हूं या संकलक मेरे लिए अक्षमता को अनुकूलित करता है?
मान लें कि मैं मानक व्यवहार के बारे में सही हूं।
क्या हैश की प्रतिलिपि से बचने के लिए हैश की प्रतिलिपि बनाने से बचने के लिए कोई वाक्यविन्यास है? यदि हैश के लिए नहीं है तो सरल सरणी के लिए कोई है?
क्या इसका मतलब यह है कि उपर्युक्त उदाहरण में मैं अपने हैश की प्रति और मेरे वास्तविक हैश के बीच असंगत मूल्य प्राप्त कर सकता हूं यदि मैं अपने लूप के भीतर हैश_फ सामग्री को संशोधित करता हूं; जिसके परिणामस्वरूप $ वैल्यू एक अलग मूल्य है तो $ हैश_फ -> ($ कुंजी)?
किसी संदर्भ को अस्वीकार करने से मूल डेटा की एक प्रति नहीं बनती है; जो पहले स्थान पर संदर्भों का उपयोग करने के उद्देश्य को हरा देगा। आप '$ foo = {% हैश}' के बारे में सोच रहे हैं, जो '% हैश' में डेटा की एक प्रति का उपयोग कर अज्ञात हैश बनाता है। – ThisSuitIsBlackNot
ध्यान दें कि 'प्रत्येक' की तुलना में 'कुंजी' और' मानों 'का उपयोग करना अधिक आम है, क्योंकि अंतिम के साथ अंत में एक लूप को समाप्त करने में समस्याएं हो सकती हैं, और एक साथ दो स्थानों में एक हैश को फिर से चालू करना पड़ सकता है। – Borodin
@ बोरोडिन इसका उल्लेख करने के लिए धन्यवाद। मैंने अनुमान लगाया था कि हैश में कुछ भी जोड़ना या निकालना खतरनाक होगा, लेकिन मैंने माना था कि पर्ल मुझे अन्यथा बचाएगा। मुझे एहसास नहीं हुआ था कि जब तक आप मुझे ऑनलाइन शोध करने के लिए प्रेरित नहीं करते तब तक यह फिर से प्रवेश नहीं किया गया था। हालांकि ऐसा लगता है कि कीज़ की कॉपीिंग समस्या है, मैं प्रत्येक – dsollen