2010-03-20 7 views
10
sub do_printf { printf @_ } 
sub do_sprintf { print sprintf @_ } 

do_printf("%s\n", "ok"); # prints ok 
do_sprintf("%s\n", "ok"); # prints 2 

उत्तर

13

perldoc on sprintf से:

क्या आप शायद मतलब printf के विपरीत, sprintf करते नहीं होती जब आप पारित यह आपकी पहली तर्क के रूप में एक सरणी। सरणी के बजाय प्रारूप के रूप में सरणी के 0 तत्व का उपयोग करने का अदिश संदर्भ दिया जाता है, और , पर्ल प्रारूप है, जो लगभग कभी नहीं उपयोगी है रूप सरणी में तत्वों की गिनती का प्रयोग करेंगे।

1

sprintf स्केलर संदर्भ में सरणी का मूल्यांकन करता है। आपके सरणी में दो तत्व हैं, इसलिए यह "2" के रूप में मूल्यांकन करता है (बिना किसी पीछे \ n)।

+1

... ठीक है, स्पष्ट बताते हुए धन्यवाद, और पोस्टर के प्रश्न का उत्तर है? ... – vladr

14

sprintf प्रोटोटाइप [email protected] जबकि printf कारण है कि वे अलग तरीके से व्यवहार करने के लिए के रूप में व्याख्या के लिए @

+0

+1 मेरा से बेहतर तकनीकी उत्तर :-) – crazyscot

+1

लेकिन क्या किसी के पास कोई विचार है, क्यों? आम तौर पर ऐसी अनजान चीजों का मतलब है कि यहां कुछ डीडब्ल्यूआईएम शामिल हैं। – codeholic

+7

कहीं से अनुमान नहीं: 'sprintf' प्रोटोटाइप' ($ @) है क्योंकि यह कर सकता है; 'printf' में कोई प्रोटोटाइप नहीं है क्योंकि (जैसे' प्रिंट') यह एक बेवकूफ फ़ाइलहेडल ले सकता है (उदाहरण के लिए 'printf FH "प्रारूप", ...' इसलिए इसे प्रोटोटाइप सिस्टम का प्रबंधन करने के लिए ऊपर और परे पार्सर जादू की आवश्यकता होती है। – hobbs

9

codeholic देखें की और Mark के जवाब के प्रोटोटाइप है है।

समाधान के लिए, बस कार्य करें:

sub do_sprintf { print sprintf(shift, @_) } 

फिर,

sub do_printf { printf @_ } 
sub do_sprintf { print sprintf(shift, @_) } 

do_printf("%s\n", "ok"); # prints ok 
do_sprintf("%s\n", "ok2"); # prints ok2 
+0

सक्षम नहीं है इसे फिर से लिखने के तरीके को समझने के लिए, ताकि sprintf आउटपुट में सभी सरणी सामग्री हो: 'sprintf ("% - * s ", 30, @ arr)' – rajeev

+0

@rajeev, शायद 'sprintf ("% - * s ", 30 , शामिल हों (',', @arr)) '? – vladr

2

वे विभिन्न बातें करते हैं।printf के लिए आउटपुट से एक स्ट्रीम है; sprintf के लिए आप स्ट्रिंग का निर्माण करना चाहते हैं। यह प्रिंट कमांड के स्वरूपण (एफ) को संभालता है। printf का मुख्य उद्देश्य उस स्ट्रीम को मुद्रित करना है जो इसे स्ट्रीम में बनाता है लेकिन एस (ट्रिंग) printf (ormat) के साथ आप केवल स्ट्रिंग को स्ट्रिंग बनाते हैं, इसे मुद्रित नहीं करते हैं।

printf प्रतिक्रिया के रूप में स्ट्रीम में मुद्रित वर्णों की संख्या देता है। एक बार पात्रों को एक धारा में मुद्रित किया जाता है, वे प्रोग्राम की तार्किक संरचना से बाहर हो जाते हैं। इस बीच, sprintf आपको एक स्ट्रिंग वापस करने की जरूरत है। सबसे सुविधाजनक तरीका रिटर्न वैल्यू के रूप में होता है - क्योंकि प्रोग्राम प्रोग्राम के भीतर यह लंबाई के लिए निरीक्षण किया जा सकता है, या इसमें कोई 'ई है, या जो भी आप चाहते हैं।

क्यों नहीं होना चाहिए वे अलग-अलग व्यवहार करते हैं?

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