perl

2012-06-26 17 views
10

में दो (संभावित रूप से) अपरिष्कृत चर की तुलना करें मैं दो चरों की तुलना करने की कोशिश कर रहा हूं जिनमें आम तौर पर तार होते हैं। ये चर डेटाबेस से उत्पन्न होते हैं, $var1 एक डीबी से और $var2 दूसरे से। जब मैं उन्हें एक लूप में तुलना करता हूं तो मैं ne ऑपरेटर का उपयोग करता हूं। हालांकि ऐसे समय होते हैं जब मैं ये चर null या undef हैं। तुलना के रूप में निम्नानुसार किया जाता है:perl

foreach my $var1 (@$varlist) 
{ 
    if ($var1 ne $var2) 
    { 
    print "vars are not equal"; 
    } 
} 

मुद्दा यह है कि अगर $var1 या $var2undef तो कर रहे हैं मैं कोई त्रुटि मिलती है। हालांकि, मुझे तब मानों की तुलना करने में सक्षम होना चाहिए जैसे कि undef b/c मुझे उन्हें लिखना होगा। मैंने वैरिएबल को एक स्ट्रिंग 'न्यूल' में परिवर्तित करने पर विचार किया और फिर वापस लेकिन यह अक्षम लग रहा था।

इसे ठीक करने का कोई तरीका? धन्यवाद!

उत्तर

11

चेक वे परिभाषित कर रहे हैं, भी:

foreach my $var1 (@$varlist) 
    if (! defined $var1 || ! defined $var2 || $var1 ne $var2) 
     print "vars are not equal"; 

यह प्रिंट कि वे बराबर नहीं कर रहे हैं अगर दोनों अपरिभाषित है। यदि आप एक और व्यवहार चाहते हैं, तो बस if अभिव्यक्ति बदलें।

+0

अगर ''var1' परिभाषित नहीं किया गया है तो अभिव्यक्ति को मुद्रित क्यों नहीं किया जाएगा? – Prateek

+0

यह मेरे उत्तर के लिए अधिक आधार था इसलिए मैंने इसे चुना। अंतिम उत्तर इस तरह दिखता था: 'जब तक ((परिभाषित $ var1 &&! परिभाषित $ var2) && (परिभाषित $ var1 && परिभाषित $ var2 && $ var1 eq $ var2))' – Prateek

+3

xor का उपयोग करके एक छोटा संस्करण: 'if (($ var1 xor परिभाषित $ var2) या $ var1 ne $ var2) ' –

7

अपरिभाषित मानों की तुलना करने में कोई त्रुटि नहीं है, यह केवल एक चेतावनी है। मैं इस तरह के मामलों में पर्ल के // ऑपरेटर (की आवश्यकता है> = v5.10) का उपयोग कर पसंद सुनिश्चित करने के लिए ऑपरेटरों परिभाषित कर रहे हैं:

if (($var1 // '') ne ($var2 // '')) { ... } 

उदाहरण के लिए, तुलना के दौरान रिक्त स्ट्रिंग के रूप में एक अपरिभाषित स्ट्रिंग व्यवहार करेगा।

चूंकि आप मुद्रित होने पर ऑपरेटरों को एक विशिष्ट मान रखना चाहते हैं (NULL एक संभावना थी), आप //= ऑपरेटर का उपयोग करने पर भी विचार कर सकते हैं। अगर वे अपरिभाषित हैं

if (($var1 //= 'NULL') ne ($var2 //= 'NULL')) { 
    print "$var1 and $var2 are not equal"; 
} 

'NULL' करने के लिए $var1 या $var2 का मान सेट, और फिर तुलना करते हैं।

+0

मुझे यह अवधारणा पसंद है, और इसे कहीं और उपयोग करेगा, लेकिन यह विशेष रूप से नहीं था जिसे मैं ढूंढ रहा था। – Prateek

5

ऐसा लगता है कि आप use warnings; का उपयोग करके सुरक्षित पर्ल का अभ्यास कर रहे हैं, लेकिन अब आप उस बिंदु पर आ सकते हैं जहां आप उन्हें चुनिंदा रूप से बंद कर देते हैं। ये चेतावनियां आपकी सुरक्षा के लिए हैं, हालांकि यदि आप जानते हैं कि आप संभावित रूप से अवांछित तारों की तुलना करने जा रहे हैं, तो उन्हें थोड़ी देर के लिए बंद कर दें (no कमांड संलग्न ब्लॉक के लिए स्थानीय है, इसलिए वे वापस चालू होते हैं)।

use strict; 
use warnings; 

foreach my $var1 (@$varlist) 
{ 
    no warnings 'uninitialized'; 
    if ($var1 ne $var2) 
    { 
    print "vars are not equal"; 
    } 
} 
+2

इस सलाह के साथ एक चेतावनी यह है कि अनावश्यक और खाली स्ट्रिंग की एक स्ट्रिंग तुलना सच हो जाएगी - जो आवश्यक हो सकता है या नहीं भी हो सकता है। –