2010-07-14 8 views
19

में ऐरे प्रारंभिकरण मैं 0 से सरणी कैसे प्रारंभ करूं?पर्ल

मैंने यह कोशिश की है।

my @arr =(); 

लेकिन यह हमेशा मुझे एक चेतावनी, "अप्रारंभीकृत मूल्य का प्रयोग करें" फेंकता है। मैं पहले से सरणी के आकार को नहीं जानता। मैं इसे गतिशील रूप से भरता हूं। मैंने सोचा था कि कोड का उपरोक्त टुकड़ा इसे 0 से शुरू करना था।

मैं यह कैसे कर सकता हूं?

+5

हमें वह कोड दिखाएं जिसमें आपको समस्या है। * क्यों * आपको इसे 0 पर सेट करने की आवश्यकता है? [एक्सवाई समस्या] (http://www.perlmonks.org/?node=XY%20problem) – Daenyth

+0

यह कुछ इसी तरह है। मेरे पास एक और सरणी है जैसे [0,0,0,1,2,2,3,3,3,4] अब मुझे 0,1,2,3,4 की संख्या गिननी है तो मैं एक और सरणी का उपयोग करूंगा ... और दिए गए इंडेक्स में गिनती स्टोर करूंगा। तो मैं होगा आगमन [0] = 3 आगमन [1] = 1 आगमन [2] = 2 आगमन [3] = 3 आगमन [4] = 4 के रूप में तो और जब मैं एक तत्व मैं मुठभेड़ करें ... arr [i] = arr [i] + 1; इसके लिए मुझे 0 के साथ initilized तत्वों के साथ शुरू करने की जरूरत है। उपरोक्त कोड काम करता है। लेकिन यह भी एक चेतावनी फेंकता है। – jerrygo

+1

आप $ arr [i] = $ arr [i] + 1 के बजाय $ arr [i] ++ कर सकते हैं; अगर आपकी सरणी खाली है, तो $ arr [i] ++ अभी भी $ arr [i] से 1 सेट करेगा; – MkV

उत्तर

45

यदि मैं आपको समझता हूं, तो शायद आपको ज़ीरो की एक सरणी की आवश्यकता नहीं है; बल्कि, आपको हैश की आवश्यकता है। हैश कुंजी अन्य सरणी में मान होंगे और हैश मान समय की संख्या मूल्य अन्य सरणी में मौजूद होगा:

use strict; 
use warnings; 

my @other_array = (0,0,0,1,2,2,3,3,3,4); 
my %tallies; 
$tallies{$_} ++ for @other_array; 

print "$_ => $tallies{$_}\n" for sort {$a <=> $b} keys %tallies;  

आउटपुट:

0 => 3 
1 => 1 
2 => 2 
3 => 3 
4 => 1 

अपने विशिष्ट प्रश्न का उत्तर देने अधिक सीधे, एक सरणी शून्यों का एक समूह के साथ आबादी बनाने के लिए, आप इन दो उदाहरणों में तकनीक का उपयोग कर सकते हैं:

my @zeroes = (0) x 5;   # (0,0,0,0,0) 

my @zeroes = (0) x @other_array; # A zero for each item in @other_array. 
           # This works because in scalar context 
           # an array evaluates to its size. 
+0

धन्यवाद। वह आश्चर्यजनक है। लेकिन फिर भी आश्चर्य है, मेरे पास हैश का उपयोग किए बिना 0 तक प्रारंभिक सरणी तत्व क्यों नहीं हो सकते हैं। समस्या यह है कि यह सिर्फ काम करता है, लेकिन एक अनियमित मूल्य तक पहुंचने से पहले मुझे चेतावनी देता है। – jerrygo

+1

@ जेरीगो: क्या आप किसी भी मौके पर पर्ल के पुराने संस्करण का उपयोग कर रहे हैं? उपरोक्त यह कोड आपको कोई चेतावनी नहीं देना चाहिए। – Ether

+0

आपको बहुत धन्यवाद ... समस्या हल हो गई। :) – jerrygo

15

"सरणी को शून्य में प्रारंभ करें" से आपका क्या मतलब है? Arrays में "शून्य" नहीं है - उनमें "शून्य तत्व" हो सकते हैं, जो "खाली सूची" जैसा ही है। या, यदि आप एक तत्व है, जहां उस तत्व एक शून्य है के साथ एक सरणी हो सकता है: my @array = (0);

my @array =(); ठीक काम करना चाहिए - यह @array नामक एक नई सरणी आबंटित करता है, और फिर इसे खाली सूची, () प्रदान करती है। ध्यान दें कि यह केवल my @array; कहने के समान है, क्योंकि एक नई सरणी का प्रारंभिक मान वैसे भी खाली सूची है।

क्या आप वाकई इस लाइन से कोई त्रुटि प्राप्त कर रहे हैं, और आपके कोड में कहीं और नहीं? सुनिश्चित करें कि आपके मॉड्यूल या स्क्रिप्ट में use strict; use warnings; है, और आपको मिलने वाली त्रुटि की लाइन संख्या जांचें। (यहां कुछ प्रासंगिक कोड पोस्ट करने से भी मदद मिल सकती है।)

+0

क्षमा करें। हाँ। मैं सरणी के तत्वों को 0 से शुरू करना चाहता हूं। इसलिए कि मैं प्रत्येक इंडेक्स के लिए सरणी का उपयोग किसी प्रकार के काउंटर के रूप में कर सकता हूं। सटीक समस्या के लिए कृपया ऊपर टिप्पणी देखें। – jerrygo

+0

यदि आप एक सरणी को एक ही सरणी के रूप में एक ही सरणी के रूप में एक विशिष्ट मूल्य के सभी तत्वों के रूप में प्रारंभ करना चाहते हैं; कुछ ऐसा करो; मेरा @ arr2 = (0) x @ arr1; – MkV

+0

@ एमकेवी: या 'मेरा @ एआर 2 = (0) x $ # arr1' साथ ही, नहीं? – dawg

3

, अपनी पोस्ट पर अपनी टिप्पणी में उत्पादन का उत्पादन करने के लिए इस होगा घ ओ यह:

use strict; 
use warnings; 

my @other_array = (0,0,0,1,2,2,3,3,3,4); 
my @array; 
my %uniqs; 

$uniqs{$_}++ for @other_array; 

foreach (keys %uniqs) { $array[$_]=$uniqs{$_} } 

print "array[$_] = $array[$_]\n" for (0..$#array); 

आउटपुट:

array[0] = 3 
    array[1] = 1 
    array[2] = 2 
    array[3] = 3 
    array[4] = 1 

यह शून्य मूल्यों के साथ एक समानांतर सरणी का निर्माण करने में अपने निर्धारित एल्गोरिथ्म की तुलना में अलग है, लेकिन यह यह करने का एक अधिक Perly तरीका है ...

यदि आपके पास समानांतर सरणी होनी चाहिए जो आपके पहले सरणी के समान आकार है, तो 0 से शुरू होने वाले तत्वों के साथ, यह कथन गतिशील रूप से ऐसा करेगा: @array=(0) x scalar(@other_array); लेकिन वास्तव में, आपको ऐसा करने की आवश्यकता नहीं है।