2010-01-30 11 views
33

नीचे दिए गए कोड में, blog post by Alias से, मैंने डबल विस्मयादिबोधक बिंदु !! का उपयोग देखा। मैं सोच रहा था कि इसका मतलब क्या था और इस तरह पर्ल सिंटैक्स के लिए स्पष्टीकरण खोजने के लिए मैं भविष्य में कहां जा सकता था। (हाँ, मैंने पहले से ही !!perlsyn पर खोजा है)।क्या करता है !! (डबल विस्मयादिबोधक बिंदु) मतलब है?

package Foo; 

use vars qw{$DEBUG}; 
BEGIN { 
    $DEBUG = 0 unless defined $DEBUG; 
} 
use constant DEBUG => !! $DEBUG; 

sub foo { 
    debug('In sub foo') if DEBUG; 

    ... 
} 

अद्यतन
अपने जवाब के सभी के लिए धन्यवाद।

यहाँ कुछ और मैं बस में पाया गया कि संबंधित है The List Squash Operator x!!

+4

यदि आपको लगता है कि '!!' एक मजेदार ऑपरेटर है, तो लूप में '-> ऑपरेटर को आज़माएं। :) – Ether

+0

ईथर, क्या आप -> ऑपरेटर के लिए एक लिंक पोस्ट कर सकते हैं? मैं नहीं जानता कि इसे Google पर कैसे ढूंढें। – Geo

+0

@ जीओओ: यहां आप जाते हैं (आप हँसेंगे; मुझे नफरत न करें): http://stackoverflow.com/questions/1642028/what-is-the-name-of-this-operator – Ether

उत्तर

47

यह केवल दो ! बूलियन नहीं है जो ऑपरेटर एक दूसरे के बगल में बैठे हैं।

इस मुहावरे का उपयोग करने का कारण यह सुनिश्चित करना है कि आपको 1 या 0 प्राप्त हो। दरअसल यह एक खाली स्ट्रिंग देता है जो 0 से कम हो जाता है। आमतौर पर इसका उपयोग केवल संख्यात्मक, या बुलियन संदर्भ में किया जाता है।

आप अक्सर Code Golf प्रतियोगिताओं में इस देखेंगे, क्योंकि यह 1 और 0 ($test ? 1 : 0) साथ त्रिगुट ? : ऑपरेटर का उपयोग की तुलना में कम है।

!! undef == 0 
!! 0  == 0 
!! 1  == 1 
!! $obj   == 1 
!! 100 == 1 

undef ? 1 : 0 == 0 
0  ? 1 : 0 == 0 
1  ? 1 : 0 == 1 
$obj ? 1 : 0 == 1 
100 ? 1 : 0 == 1 
+9

मैं वास्तव में अक्सर अपने कोड में '!!!!' का उपयोग करता हूं, क्योंकि '!! 'विम के सिंटैक्स हाइलाइटिंग को भ्रमित करता है और दूसरा' !! 'इसे पुनर्स्थापित करेगा! – Ether

+26

@ अन्य: * जाहिर है *, आपको emacs का उपयोग करने की आवश्यकता है। :) –

+10

यह 1 या कैननिकल झूठा मान उत्पन्न करता है, 0 नहीं। यह संख्यात्मक संदर्भ में 0 है लेकिन स्ट्रिंग संदर्भ में खाली स्ट्रिंग है। 0 या 1 प्राप्त करने के लिए, '1-!' ऑपरेटर का उपयोग करें :) – ysth

12

नहीं-नहीं है।

यह मूल्य को एक बूलियन में परिवर्तित करता है (या पर्ल के रूप में बंद होने के कारण)।

+4

यह जावास्क्रिप्ट की तरह अन्य भाषाओं में भी एक आम मुहावरे है। – mpeters

+0

@ डेविड डोरवर्ड आपके उत्तर के लिए धन्यवाद! –

-1

क्योंकि तीन अन्य उत्तर का दावा है कि सीमा है "0" या "1", मैं बस सोचा था कि मुझे लगता है कि पर्ल में बूलियन्स (के रूप में ==, not, और इतने पर जैसे ऑपरेटरों द्वारा दिया) कर रहे हैं उल्लेख करें undef और 1, 0 और 1 नहीं।

+3

यह सही नहीं है। जब किसी ऑपरेटर को झूठा मान उत्पन्न करना होता है, तो यह एक जादू मान का उपयोग करता है जो स्ट्रिंग संदर्भ में खाली स्ट्रिंग या संख्यात्मक संदर्भ में 0 के रूप में मूल्यांकन करता है। (अपवाद ऑपरेटर हैं जैसे 'और' और' या', जो केवल ऑपरेंड को वापस लौटाते हैं जिससे उन्हें झूठी वापसी होती है।) (Http://perldoc.perl.org/perlsyn.html#Truth-and-Falsehood देखें) – cjm

+2

undef भी एक जादू मान है जो 'स्ट्रिंग संदर्भ में' और संख्यात्मक संदर्भ में 0 के रूप में मूल्यांकन करता है - केवल अंतर यह है कि जब चेतावनियां सक्षम होती हैं, तो इसकी स्ट्रिंग या न्यूमेरिक मान के लिए अपरिफ का उपयोग करना चेतावनी उत्पन्न करने के लिए उपयुक्त होता है, जबकि 'झूठा मूल्य' ऐसी कोई चीज़ नहीं करता है;) – hobbs

+2

@ हॉब्स: ठीक है, एक और अंतर यह है कि 'परिभाषित (अपरिभाषित)' गलत है , लेकिन परिभाषित (1 == 2) 'सत्य है। – cjm