मैंने कोशिश की है:
$var = false;
$var = FALSE;
$var = False;
इनमें से कोई काम नहीं करता। मुझे त्रुटि संदेश मिलता है
"सख्त उप" उपयोग में होने के बावजूद "गलत" अनुमति नहीं है।
मैंने कोशिश की है:
$var = false;
$var = FALSE;
$var = False;
इनमें से कोई काम नहीं करता। मुझे त्रुटि संदेश मिलता है
"सख्त उप" उपयोग में होने के बावजूद "गलत" अनुमति नहीं है।
जवाबों:
Perl में, सशर्त में झूठे का मूल्यांकन करें:
0
'0'
undef
'' # Empty scalar
() # Empty list
('')
बाकी सब सच है। वहाँ के लिए कोई barewords हैं true
या false
।
undef
।
('')
और ''
समान मूल्य हैं। मुझे लगता है कि आप एक तत्व के साथ एक सूची को लागू करना चाहते थे जिसमें एक खाली स्ट्रिंग शामिल है (भले ही parens सूची नहीं बनाते हैं), लेकिन जैसा कि मैंने पहले ही उल्लेख किया है, यह जांचना असंभव है कि क्या कोई सूची झूठी है।
!0
aka PL_sv_yes
) और असत्य ( !1
aka PL_sv_no
) होता है। या आप कह रहे हैं कि पर्ल को क्रोक होना चाहिए जब भी इन दो मूल्यों के अलावा कुछ और सच्चाई के लिए परीक्षण किया जाता है? यह पूरी तरह से भयानक होगा। उदा। इससे बचाव होगा$x ||= $default;
सबसे झूठी, संक्षिप्त परिभाषा जो मेरे सामने आई है, वह है:
जो कुछ भी खाली स्ट्रिंग या स्ट्रिंग
0
को स्ट्रिंग करता है वह झूठा है। बाकी सब सच है।
इसलिए, निम्न मान गलत हैं:
ध्यान रखें कि एक खाली सूची शाब्दिक स्केलर संदर्भ में एक अपरिभाषित मूल्य का मूल्यांकन करती है, इसलिए यह कुछ गलत का मूल्यांकन करता है।
"सच्चे शून्य" पर एक नोट
जबकि संख्याएँ जो 0
स्ट्रिंग को गलत बनाती हैं, वे तार जो शून्य पर संख्याबद्ध होते हैं, आवश्यक नहीं हैं। केवल झूठे तार हैं 0
और खाली स्ट्रिंग है। कोई भी अन्य स्ट्रिंग, भले ही वह शून्य के बराबर हो, सच है।
निम्नलिखित वे तार हैं जो एक संख्या के रूप में एक बूलियन और शून्य के रूप में सत्य हैं:
"0.0"
"0E0"
"00"
"+0"
"-0"
" 0"
"0\n"
".0"
"0."
"0 but true"
"\t00"
"\n0e1"
"+0.e-9"
Scalar::Util::looks_like_number
गलत है। (उदा "abc"
)my $value = do { package XXX; use overload q[""] => sub { "XXX" }, q[bool] => sub { 0 }; bless [] };
। अब $value
"एक्सएक्सएक्स" पर सख्ती करेंगे लेकिन झूठे को गलत ठहराएंगे।
bool
को सख्त बनाता है 0
। इसके अलावा, आपको असंगत अधिभार बनाने से हतोत्साहित किया जाता है, और आपके द्वारा लौटाए गए मूल्यों को ऐसे माना जा सकता है। (उदाहरण के लिए एक &&
में अनुकूलित किया जा सकता है ||
, इसलिए यदि ये असंगत थे, तो आपको एक समस्या होगी।)
0x00
यहां कवर किया गया है।
0x00
(संख्यात्मक मान शून्य) या स्ट्रिंग 0x00
(जिसके looks_like_number
लिए गलत है) द्वारा लौटाए गए मूल्य का मतलब है ? किसी भी तरह से, यह पहले से ही कवर किया गया है।
पर्ल में एक देशी बूलियन प्रकार नहीं है, लेकिन आप समान व्यवहार प्राप्त करने के लिए पूर्णांक या स्ट्रिंग्स की तुलना का उपयोग कर सकते हैं। एलन का उदाहरण पूर्णांक की तुलना का उपयोग करने का एक अच्छा तरीका है। यहाँ एक उदाहरण है
my $boolean = 0;
if ( $boolean ) {
print "$boolean evaluates to true\n";
} else {
print "$boolean evaluates to false\n";
}
एक चीज जो मैंने अपने कुछ कार्यक्रमों में की है, एक निरंतर का उपयोग करके समान व्यवहार जोड़ा जाता है:
#!/usr/bin/perl
use strict;
use warnings;
use constant false => 0;
use constant true => 1;
my $val1 = true;
my $val2 = false;
print $val1, " && ", $val2;
if ( $val1 && $val2 ) {
print " evaluates to true.\n";
} else {
print " evaluates to false.\n";
}
print $val1, " || ", $val2;
if ( $val1 || $val2 ) {
print " evaluates to true.\n";
} else {
print " evaluates to false.\n";
}
"निरंतर का उपयोग करें" में चिह्नित लाइनें एक निरंतर नाम सच को परिभाषित करती हैं जो हमेशा 1 का मूल्यांकन करता है, और एक निरंतर नाम गलत है जो हमेशा 0 से मूल्यांकन करता है। जिस तरह से कॉन्स्टैंट को पर्ल में परिभाषित किया गया है, उस तरह से कोड की निम्नलिखित पंक्तियां भी विफल हो जाती हैं:
true = 0;
true = false;
त्रुटि संदेश कुछ इस तरह कहना चाहिए "स्केलर असाइनमेंट में निरंतर संशोधित नहीं कर सकता।"
मैंने देखा कि एक टिप्पणी में आपने तार की तुलना करने के बारे में पूछा था। आपको यह पता होना चाहिए कि क्योंकि पर्ल स्केलर वैरिएबल में स्ट्रिंग्स और न्यूमेरिक प्रकारों को जोड़ती है, आपके पास स्ट्रिंग्स और संख्याओं की तुलना करने के लिए अलग-अलग सिंटैक्स हैं:
my $var1 = "5.0";
my $var2 = "5";
print "using operator eq\n";
if ( $var1 eq $var2 ) {
print "$var1 and $var2 are equal!\n";
} else {
print "$var1 and $var2 are not equal!\n";
}
print "using operator ==\n";
if ( $var1 == $var2 ) {
print "$var1 and $var2 are equal!\n";
} else {
print "$var1 and $var2 are not equal!\n";
}
इन ऑपरेटरों के बीच का अंतर पर्ल में भ्रम का एक बहुत ही आम स्रोत है।
use warnings;
इसके बजाय#! perl -w
if ($exitstatus) { exit; }
बनाम if ($exitstatus == true) { exit; }
, जो एक आकस्मिक पर्यवेक्षक के लिए स्पष्ट नहीं हो सकता है। (और हां, अंतिम उदाहरण खराब प्रोग्रामिंग शैली है, लेकिन यह बिंदु के बगल में है)।
मैं सलाह देता हूं use boolean;
। आपको हालांकि cpan से बूलियन मॉड्यूल को स्थापित करना होगा ।
if ($my_true_value == true)
। यह कहते हुए कि एक सच्चा सत्य है, मेरे अनुभव में, दर्द का एक रास्ता है, और अक्षम कोड है।
मेरा पसंदीदा हमेशा से रहा है
use constant FALSE => 1==0;
use constant TRUE => not FALSE;
जो आंतरिक प्रतिनिधित्व से पूरी तरह से स्वतंत्र है।
मैं एक ट्यूटोरियल के बारे में आया, जिसमें पर्ल में सही और गलत मूल्यों के बारे में अच्छी तरह से व्याख्या की गई है । यह बताता है कि:
अदिश मानों को गलत माना जाता है:
undef
- अपरिभाषित मूल्य0
संख्या 0, भले ही आप इसे 000 या 0.0 के रूप में लिखते हैं''
खाली स्ट्रिंग।'0'
स्ट्रिंग जिसमें एक 0 अंक होता है।निम्नलिखित सहित सभी अन्य अदिश मान सत्य हैं:
1
कोई भी गैर 0 नंबर' '
इसमें एक स्पेस के साथ स्ट्रिंग'00'
एक स्ट्रिंग में दो या अधिक 0 अक्षर"0\n"
0 के बाद एक नई पंक्ति'true'
'false'
हां, यहां तक कि स्ट्रिंग 'असत्य' भी सही का मूल्यांकन करता है।एक और अच्छा ट्यूटोरियल है जो पर्ल के बारे में सही और गलत बताता है ।
बूलियन मूल्यों के लिए बॉब द्वारा दी गई सुंदर व्याख्या : सही या गलत? एक त्वरित संदर्भ गाइड
विभिन्न मूल्यों के लिए सत्य परीक्षण
Result of the expression when $var is:
Expression | 1 | '0.0' | a string | 0 | empty str | undef
--------------------+--------+--------+----------+-------+-----------+-------
if( $var ) | true | true | true | false | false | false
if( defined $var ) | true | true | true | true | true | false
if( $var eq '' ) | false | false | false | false | true | true
if( $var == 0 ) | false | true | true | true | true | true
निम्न फ़ाइल उपसर्ग का उपयोग करें, यह आपकी पर्ल स्क्रिप्ट को eTRUE और eFALSE में जोड़ेगा, यह वास्तव में वास्तविक (!) सत्य और असत्य होगा (बिल्कुल जावा की तरह)
#!/usr/bin/perl
use strict;
use warnings;
use constant { #real true false, compatible with encode_json decode_json for later (we don't want field:false... will be field:0...)
eTRUE => bless( do{\(my $o = 1)}, 'JSON::PP::Boolean' ),
eFALSE => bless( do{\(my $o = 0)}, 'JSON::PP::Boolean' )
};
वास्तव में, कुछ कारण हैं जिनके कारण आपको इसका उपयोग करना चाहिए।
मेरा कारण यह है कि JSON के साथ काम करते हुए, मुझे कुंजी के मान के रूप में 0 और 1 मिला है, लेकिन यह हैक सुनिश्चित करेगा कि आपकी स्क्रिप्ट के साथ सही मान रखे गए हैं।