2012-04-20 8 views
15

मैंने हाल ही में पेर्ल सीखना शुरू कर दिया है और एक सवाल है कि मुझे इंटरनेट पर स्पष्ट उत्तर नहीं मिल रहा है। कहते हैं कि मैं कुछ इस तरह है,स्केलर संदर्भ में एक पर्ल ऐरे फ़्लैटन करने के तरीके

@arr = (1, 2, 3); 
$scal = "@arr" 
# $scal is now 123. 

उद्धरण के उपयोग के लिए इतना है कि प्रत्येक तत्व अदिश मूल्य में संग्रहीत किया जाता सरणी समतल करने का एकमात्र तरीका है? यह असंभव प्रतीत होता है लेकिन मुझे ऐसा करने के किसी भी अन्य तरीके नहीं मिला है। अग्रिम में धन्यवाद।

उत्तर

32

join फ़ंक्शन आमतौर पर "फ़्लैटन" सूचियों के लिए उपयोग किया जाता है। परिणामस्वरूप स्ट्रिंग में प्रत्येक तत्व के बीच आप जो चाहते हैं उसे निर्दिष्ट करते हैं।

$scal = join(",", @arr); 
# $scal is no "1,2,3" 
+0

क्या होगा यदि आप सब कुछ छोड़ना चाहते हैं लेकिन सरणी का पहला तत्व, लेकिन पहले सरणी को सरणी को स्टोर किए बिना? –

+0

@AlexejMagura: इस प्रश्न के संदर्भ में समझ में नहीं आता है।यदि आप केवल सरणी में पहला आइटम चाहते हैं तो इसे लें। केवल एक स्केलर फ़्लैटनिंग बहुत उपयोगी नहीं है। – Mat

5

आप किसी भी विभाजक

my $scalar = join('' , @array) ; 

बिना join इस्तेमाल कर सकते हैं एक से अधिक तरीके यह करने के लिए नहीं है।

+0

पेडेंटिक रूप से, यह बिना किसी विभाजक के 'जुड़ें()' का उपयोग नहीं कर रहा है, यह अलग-अलग स्ट्रिंग के साथ 'join() 'का उपयोग कर रहा है क्योंकि विभाजक :-) –

-2

section Context in perldata पढ़ें। पर्ल में दो प्रमुख संदर्भ हैं: स्केलर और सूची।

उदाहरण के लिए:

@a = (1, 1, 1); # list context 
print @a;   # list context 
$count = @a;  # scalar context, returns the number of elements in @a 

आदि

+2

इसका एक * सरणी * flattening * के साथ कुछ भी नहीं है। – Borodin

4

TIMTOWTDI की भावना में:

my $scal; 
$scal .= $_ foreach @arr; 
13

अपने उदाहरण में, आप एक डबल-कोटेड स्ट्रिंग में एक सरणी interpolating रहे हैं। उन परिस्थितियों में क्या होता है इसे पर्ल के $" चर द्वारा नियंत्रित किया जाता है। perldoc perlvar से:

$ LIST_SEPARATOR

$ "

जब किसी सरणी या एक सरणी टुकड़ा एक डबल-कोटेड स्ट्रिंग या किसी ऐसे ही संदर्भ में अंतर्वेशित है जैसे /.../, उसके तत्वों इस मान से अलग होते हैं डिफ़ॉल्ट एक जगह नहीं है उदाहरण के लिए, इस:।।

print "The array is: @array\n";

इस के बराबर है:

print "The array is: " . join($", @array) . "\n";

निमोनिक: डबल-उद्धृत संदर्भ में काम करता है।

$" के लिए डिफ़ॉल्ट मान एक स्थान है। आप स्पष्ट रूप से $" के मान को बदल सकते हैं।

{ 
    local $" = ':', 
    my @arr = (1, 2, 3); 
    my $scalar = "@arr"; # $scalar contains '1:2:3' 
} 

पर्ल के विशेष चर के किसी भी के साथ, कोड ब्लॉक में किसी भी बदलाव को स्थानांतरित करना हमेशा सर्वोत्तम होता है।

+0

यदि सरणी में कोई भी मान 'undef' है तो यह चेतावनी फेंक रहा है। इसे कैसे हल करें? –

+0

निर्भर करता है कि आप क्या करना चाहते हैं। मैं तीन स्पष्ट विकल्पों के बारे में सोच सकता हूं। 1/चेतावनियों को अनदेखा करें। 2/अपरिभाषित तत्वों को हटाने के लिए सरणी पर 'grep' का प्रयोग करें। 3/अपरिभाषित तत्वों को किसी अन्य मूल्य (शायद एक खाली स्ट्रिंग) में बदलने के लिए सरणी पर 'मानचित्र' का उपयोग करें। यदि आपको और अधिक जानकारी चाहिए, तो आपको शायद एक नया प्रश्न पूछना चाहिए। –

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