2015-11-24 4 views
5

मैं निम्नलिखित की तरह एक सरणी है।पर्ल में बिल्टिन फ़ंक्शन (स्प्रिंटफ, जॉइन इत्यादि) के तर्कों के रूप में मैं सरणी का उपयोग कैसे कर सकता हूं?</p> <pre><code>my @a = ('%d %d', 10, 20); </code></pre> <p>मैं एक समारोह के लिए तर्क के रूप में इस सरणी के तत्वों का उपयोग करना चाहते हैं:

अगर मैं तो बस उसे सीधे उपयोग करने का प्रयास है, यह अदिश संदर्भ में व्याख्या हो जाता है:

say sprintf(@a);  #=> 3 

मैं भी इस है, जो निश्चित रूप से काम नहीं किया की कोशिश की:

@_ = @a; say sprintf; #=> Not enough arguments... 

सूचक सिंटैक्स कुछ भाषाएं यहां या तो काम नहीं करती हैं (मैं इस बिंदु पर जंगली अनुमान ले रहा हूं):

say sprintf(*@a);  #=> (error) 

अन्य बिल्टिन फ़ंक्शंस जैसे join के साथ समान समस्याएं होती हैं।

क्या मनमाने ढंग से सरणी (अज्ञात लंबाई) और मनमाने ढंग से कार्य करने का कोई तरीका है और फ़ंक्शन के लिए तर्क के रूप में सरणी के तत्वों का उपयोग करके फ़ंक्शन को कॉल करें? यदि हां, तो कैसे?

+5

संबंधित: [केवल एक सरणी दिए जाने पर printf और sprintf अलग-अलग व्यवहार क्यों करते हैं?] (Http://stackoverflow.com/q/2485106/176646) – ThisSuitIsBlackNot

+2

फिर भी एक और कारण है कि पर्ल प्रोटोटाइप वास्तव में विचलित हो सकता है। – Sobrique

उत्तर

7

sprintf प्रोटोटाइप [email protected] है, @ नहीं है, इसलिए इसका पहला तर्क स्केलर संदर्भ में मूल्यांकन किया जाता है।

& के साथ एक उप कॉल लगाकर प्रोटोटाइप पर ध्यान नहीं देता है, लेकिन आप builtins का पूरा नाम का उपयोग करना चाहिए उन्हें उप कॉल होने के लिए:

say &CORE::sprintf(@a); # Perl 5.16+ 

या पहले तर्क स्पष्टतः पास:

say sprintf($a[0], @a[1..$#a]); 
+0

... या यदि आप जो भी कर रहे हैं वह प्रिंटिंग कर रहा है, तो 'printf' का उपयोग करें, जो सरणी के 0 वें तत्व को प्रारूप स्ट्रिंग के रूप में उपयोग करता है। – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot ... और अंतिम न्यूलाइन के लिए 'कहना' ';' भी जोड़ें। – rightfold

+0

आह, शायद मुझे केवल एक समारोह से अधिक के साथ पहले प्रयास का परीक्षण करना चाहिए था ... (हालांकि कुछ अन्य लोग जैसे 'जॉइन' समान व्यवहार प्रदर्शित करते हैं)। धन्यवाद! – Doorknob

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

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