2011-08-07 8 views
7

नीचे कोड के एक ब्लॉक का सामान्यीकरण है जिसे मैं लिखना जारी रखता हूं जब मैं किसी प्रकार के लूप के अंदर सरणी के हैश बनाना चाहता हूं।सरणींड एरे के हैश में नए मान जोड़ने के लिए

#get value and key that I want to use 
my $value = getvalue(); 
my $key = getKey(); 

#add value to hash using key 
if($hash_of_arrays{$key}){ 
    push(@{$hash_of_arrays{$key}}, $value); 
} 
else{ 
    $hash_of_arrays{$key} = [$value]; 
} 

अगर बयान बहुत तरह के एक सरल कार्य के लिए लिखने के लिए कठिन है, लेकिन यह किया जा सकता है क्योंकि जब उसके प्रमुख हैश में अपरिभाषित है एक मूल्य धक्का समस्याओं का कारण बनता की जरूरत है। मैं बस सोच रहा हूं कि यह लिखने के लिए कोई शॉर्टलैंड है - एक जहां मुझे $hash_of_arrays{$key} लिखना नहीं है।

उत्तर

14

push @{ $HoA{$key} }, $value; पूरी तरह से अच्छी तरह से काम करता है और यह करने की अनुशंसित चीज है। यदि आपके कोड का उपयोग करने में "समस्याएं" हैं, तो इसके बजाय उन समस्याओं के बारे में पूछें।

+0

ठीक है, अब मुझे पूरा यकीन नहीं है कि आखिरी बार मैंने कोशिश की कि कैसे मैंने कोशिश की! मैंने सोचा कि यह "ARRAY संदर्भ नहीं" त्रुटि उत्पन्न करता है लेकिन यह अपरिभाषित चर के लिए ऐसा प्रतीत नहीं होता है। धन्यवाद! – MattLBeck

+0

यह undefs के लिए नहीं होता है, लेकिन ऐसा होता है यदि आप इसे एक सरणी के रूप में इलाज करने का प्रयास करने से पहले '$ होआ {$ कुंजी}' में स्ट्रिंग की तरह कुछ डालते हैं :) – hobbs

+2

इस विधि को ऑटोविविफिकेशन कहा जाता है। ब्रायन डी फोय का एक लेख है कि इसे कैसे बंद करें: http://www.effectiveperlprogramming.com/blog/1256 – shawnhcorey

0

सहजता से, जब आप स्वयं को कोड दोहराते हैं, तो एक फ़ंक्शन या ऑब्जेक्ट करें जो आपके लिए यह करता है।

हालांकि, इस विशिष्ट मामले के लिए, आप Perl Recipe 13.15: Tie Example: Make a Hash That Always Appends देख सकते हैं। आप केवल हैश को एक मान असाइन कर सकते हैं, और यह अंतर्निहित सरणी में स्वचालित रूप से इसे जोड़ देगा।

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