2011-10-03 14 views
12

यह सामान्य उदाहरण कोड का एक टुकड़ा है:पर्ल सोच -1 क्यों सच है?

while (1) { 
    print "foo\n"; 
} 

जो प्रिंट 'foo' हमेशा के लिए।

perl foo.pl 
foo 
foo 
foo 
... 

और

while (0) { print "foo\n"; } 

चुपचाप मर जाता है के रूप में आप उम्मीद:

perl test.pl 

कोई व्याख्या कर सकते हैं क्यों यह जबकि का एक उपयोगी कार्यान्वयन है? इस पर 5.10 कम से कम, यूनिक्स और MacOS एक्स काम करता है:

while (-1) { print "foo\n"; } 

जो

foo 
foo 
foo 
... 
+12

'-1' कई भाषाओं में एक वास्तविक मूल्य माना जाता है। – Quentin

+5

पर्ल में, 0 झूठा है; कुछ भी जो झूठ नहीं है सच है। –

+4

मैं इस सवाल के कारण क्या उत्सुक हूं। क्या कोई ऐसी भाषा है जो -1 झूठी मानती है? – ikegami

उत्तर

18

यदि कुछ भी एक कह सकते हैं -1 अधिक के बाद से -1 (111..111b) 1 से सच होने की संभावना है शून्य (000..000b) की बिटवाइज़ निषेध है। बेसिक और जीडब्ल्यू-बेसिक 1 का उपयोग किया जाता है जब उन्हें एक वास्तविक मूल्य वापस करने की आवश्यकता होती है।

भले ही, पर्ल ने फैसला किया कि "खाली" या "कुछ नहीं" का अर्थ गलत है। ज्यादातर भाषाएं एक समान दृश्य लेती हैं। विशेष रूप से, पूर्णांक शून्य, फ़्लोटिंग पॉइंट शून्य, स्ट्रिंग शून्य, खाली स्ट्रिंग और अपरिफ गलत हैं।

यह documented है, हालांकि दस्तावेज़ों को खराब तरीके से लिखा गया है। (यह () को एक मान के रूप में सूचीबद्ध करता है जो कि गलत है, लेकिन ऐसा कोई मान नहीं है।)

स्थिरता के अलावा, यह दृष्टिकोण लेने में बहुत उपयोगी है। उदाहरण के लिए, यह पर्ल awk और C से इस व्यवहार को ले लिया एक

if (@x) 

if (@x != 0) 
+1

सूची संदर्भ में खाली सूची के लिए एक मान है, 'if (($ x) = (undef)) की तुलना करें {# true' vs 'if (($ x) =()) {# false'। दोनों मामलों में '$ x' को अपरिचित करने के लिए सेट किया गया है, लेकिन अभिव्यक्ति की सत्य सूची में तत्वों की संख्या द्वारा निर्धारित की जाती है, न कि उन तत्वों के मानों से। –

+1

@ वेनत्त्सु, नहीं, ऐसा नहीं है। आपके द्वारा पोस्ट किया गया कोड असाइनमेंट के वापसी मूल्य का परीक्षण करता है, न कि '()' का वापसी मूल्य। – ikegami

+1

@ वेनट्ससु, यदि आप उत्सुक हैं, तो स्केलर संदर्भ में सूची असाइनमेंट आरएचएस द्वारा लौटाए गए तत्वों की संख्या देता है। जैसे 'स्केलर (($ x) = (4,5)); 'प्रिंट' 2' और 'स्केलर (($ x) =()) कहें;' प्रिंट' 0'।) – ikegami

19

देता है प्रत्येक गैर-शून्य पूर्णांक true मूल्यांकन करता है। और 0 हमेशा false

+2

यह आपका उत्तर है। –

+3

ये उत्तर tautological हैं। मैं यह नहीं पूछ रहा था कि यह सच है, मैं इसे देख सकता हूं। सवाल यह है कि यह सच क्यों है। मैंने इसे पोस्ट करने से पहले कुछ लेखों को देखा और वास्तव में इस तथ्य का उल्लेख नहीं किया गया है कि मैं देख सकता हूं। सकारात्मक पूर्णांक आमतौर पर दिए गए सभी उदाहरण होते हैं। – shigeta

+2

11 अपवॉट्स .. =) यह वास्तव में आसान उत्तर है जो सबसे बड़ी प्रतिष्ठा पुरस्कार देता है। – TLP

4

केवल 0 पूर्णांक को झूठा माना जाता है। कोई अन्य गैर-शून्य पूर्णांक सत्य माना जाता है।

+3

सच नहीं है। '" "कुछ ऐसा देता है जो न तो शून्य है और न ही सत्य है। – ikegami

+0

मैं पाठ्यक्रम के पूर्णांक के बारे में बात कर रहा हूं। मैंने अपनी पोस्ट अपडेट की है। – Kirk

2

कोई पूर्णांक <> 0 सत्य है। 0 हमेशा झूठा है।

+1

शून्य लेकिन सत्य: perl -E 'कहते हैं "0e0"? "सच": "झूठा" 'एक ऐसी भाषा में एक भेद होना चाहिए जिसमें स्ट्रिंग्स और संख्याओं के बीच सख्त टाइपिंग सिस्टम न हो। 0e0 एक संख्या हो सकती है, यह एक स्ट्रिंग हो सकती है (जो शून्य तक भी मूल्यांकन करती है), और यह एक वास्तविक स्ट्रिंग (ई की वजह से) हो सकती है। कभी-कभार भ्रम का एक मामूली बिंदु। – DavidO

+1

@ डेविडो, सच है, लेकिन '0e0" 'सीएस भावना में एक पूर्णांक नहीं लौटाता है। – ikegami

16

perldoc perlsyn (Truth and Falsehood) से:

संख्या 0, तार '0' और ', खाली सूची(), और undef एक बूलियन संदर्भ में सभी झूठे हैं। अन्य सभी मूल्य सत्य हैं।

-1 सत्य माना जाता है।

+0

मैंने हमेशा यह माना है कि बूलियन संदर्भ में एक सूची का परीक्षण करते समय, मैं वास्तव में स्केलर संदर्भ में इसका परीक्षण कर रहा हूं, जो खाली होने पर शून्य देता है, इस प्रकार झूठा। क्या यह वास्तव में सच है कि एक सूची में एक बुलियन संदर्भ मूल्यांकन है जिसे पहले स्केलर उपचार नहीं मिलता है? –

+0

यह सवाल का जवाब नहीं देता है। – reinierpost

+0

@ जोएल: अधिक संभावना है कि खाली सूची का भ्रम से बचने के लिए अभी उल्लेख किया गया है। स्केलर संदर्भ में, एक खाली सरणी '0' (तत्वों की संख्या) का मूल्यांकन करती है और एक खाली सूची' undef' (इसका अंतिम तत्व) का मूल्यांकन करती है, जिनमें से दोनों को पहले से ही झूठ बोलने के लिए किसी भी विशेष-मामले तर्क की आवश्यकता के बिना झूठी होती है। –

4

प्रश्न है 'पर्ल सोच -1 क्यों सच है?'

उत्तर तब होता है जब पेर्ल विकसित किया गया था, यह निर्णय लिया गया था कि कुछ मूल्य गलत साबित होंगे। ये हैं:

  • undef
  • '' (खाली स्ट्रिंग)

है बस इतना ही मैं क्यों के रूप में एक एक उपयुक्त जवाब के बारे में सोच सकते हैं। यह सिर्फ इस तरह से डिजाइन किया गया था।

1

के बजाय का उपयोग करने की अनुमति देता है।

क्यों C यह here समझाया गया है।

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