मैं पर्ल में दो तारों की तुलना कैसे करूं?


178

मैं पर्ल में दो तारों की तुलना कैसे करूं?

मैं पर्ल सीख रहा हूं, मेरा यह मूल प्रश्न था कि इसे स्टैकऑवरफ्लो पर यहां देखा गया और कोई अच्छा जवाब नहीं मिला, इसलिए मैंने सोचा कि मैं पूछूंगा।


3
आपको पहले उत्कृष्ट दस्तावेज से परामर्श करना चाहिए जो पर्ल के साथ आता है।
सिनान Julnür

5
आप एक पुस्तक जैसे कि लर्निंग पर्ल (जिसे मैंने सह-लेखक किया है) की जाँच करना चाह सकते हैं । इस सवाल के अच्छे जवाब नहीं थे क्योंकि यह बहुत बुनियादी है। एक ट्यूटोरियल आपको मूल बातें जल्दी से लेने में मदद करेगा।
ब्रायन डी फ़ो

जवाबों:


184

पेरलोक पेरलोप देखें । का प्रयोग करें lt, gt, eq, ne, और cmpस्ट्रिंग तुलना के लिए उपयुक्त के रूप में:

eqयदि सही तर्क सही तर्क के बराबर है तो बाइनरी रिटर्न सही है।

neअगर सही तर्क के बराबर नहीं है तो बाइनरी रिटर्न सही है।

द्विआधारी cmpरिटर्न -1, 0, या 1 इस बात पर निर्भर करता है कि बाएं तर्क, सही तर्क की तुलना में कम, के बराबर या अधिक कठोर है।

बाइनरी ~~अपने तर्कों के बीच एक स्मार्टमैच करता है। ...

lt, le, ge, gtऔर cmpमिलान (प्रकार) आदेश वर्तमान स्थान द्वारा निर्दिष्ट का उपयोग करता है, तो एक विरासत उपयोग स्थल (लेकिन use locale ':not_characters') प्रभाव में है। पेरोलोकेल देखें । केवल यूनीकोड ​​के साथ इनको न मिलाएं, केवल विरासत बाइनरी एनकोडिंग के साथ। मानक यूनिकोड :: Collate और Unicode :: Collate :: लोकेल मॉड्यूल टकराव के मुद्दों के लिए अधिक शक्तिशाली समाधान प्रदान करते हैं।


9
बस एक और, न के बराबर।
PJT

4
आप उल्लेख करना चाह सकते हैं कि $ str1 = ~ "$ str2" (not / $ str2 /) यह जांच करेगा कि $ str2 $ str1 का विकल्प है या नहीं।
डैनियल सी। सोबरल जूल

@ डैनियल indexयह देखने के लिए उपयोग करता है कि क्या एक स्ट्रिंग दूसरे का एक विकल्प है।
सिनान ürnür

3
@ डैनियल: उस मामले के लिए = ~ "$ str2" और = ~ / $ str2 / (या सिर्फ = ~ $ str2) के बीच ज्यादा व्यावहारिक अंतर नहीं है; सूचकांक सही उपकरण है, लेकिन अगर आपको किसी कारण से regex का उपयोग करने की आवश्यकता है, तो = ~ / \ Q $ str2 \ E / करें।
ysth

1
@IliaRostovtsev !=और neसमान नहीं हैं, क्योंकि !=और neभिन्न होने के लिए परिभाषित हैं। कितना कठिन है ?! एक संख्यात्मक तुलना ऑपरेटर होने के नाते, !=अपने दोनों ऑपरेंड को संख्याओं में परिवर्तित करता है perl -E 'say "equal" if not "a" != "b"'
सिनान Jannür

137
  • cmp तुलना

    'a' cmp 'b' # -1
    'b' cmp 'a' #  1
    'a' cmp 'a' #  0
  • eq के बराबर

    'a' eq  'b' #  0
    'b' eq  'a' #  0
    'a' eq  'a' #  1
  • ne बराबर नही है

    'a' ne  'b' #  1
    'b' ne  'a' #  1
    'a' ne  'a' #  0
  • lt से कम

    'a' lt  'b' #  1
    'b' lt  'a' #  0
    'a' lt  'a' #  0
  • le से कम या बराबर

    'a' le  'b' #  1
    'b' le  'a' #  0
    'a' le  'a' #  1
  • gt से अधिक

    'a' gt  'b' #  0
    'b' gt  'a' #  1
    'a' gt  'a' #  0
  • ge इससे बड़ा या इसके बराबर

    'a' ge  'b' #  0
    'b' ge  'a' #  1
    'a' ge  'a' #  1

perldoc perlopअधिक जानकारी के लिए देखें ।

(मैं इसे थोड़ा सा सरल कर रहा हूं, लेकिन cmpएक ऐसा मान लौटाता हूं, जो दोनों खाली स्ट्रिंग है, और इसके बजाय एक संख्यात्मक शून्य मान है 0, और एक मूल्य जो स्ट्रिंग '1'और संख्यात्मक मान दोनों है 1। ये वही मान हैं जो आप करेंगे) हमेशा पर्ल में बूलियन ऑपरेटरों से प्राप्त करें। आपको वास्तव में केवल बूलियन या न्यूमेरिक ऑपरेशंस के लिए रिटर्न वैल्यू का उपयोग करना चाहिए, जिसमें अंतर वास्तव में मायने नहीं रखता है।)


8
मुझे यह उत्तर अधिक पसंद है। लघु सरल उदाहरण आम तौर पर न्यूक्लियर के लिए अधिक सहायक होते हैं, केवल केलेल मल्टीफ़ोर्स डॉक्स संदर्भ से।
ज़ोन

@Zon को छोड़कर eq, के लिए वापसी मान gt, ltआदि सही नहीं हैं ... वे सही या गलत लौटाते हैं। केवल cmpविशिष्ट संख्यात्मक मान लौटाता है।
सिनान Aprnür

पर्ल 6 समान ऑपरेटरों का उपयोग करता है, legइसके बजाय इसका उपयोग करता है cmpजिसके बजाय सामान्य तुलना के लिए उपयोग किया जाता है।
ब्रैड गिल्बर्ट

17

स्ट्रिंग तुलना संचालकों की व्यापक लिस्टिंग सिनान comprehensivenür की लत में, पर्ल 5.10 स्मार्ट मैच ऑपरेटर जोड़ता है।

स्मार्ट मैच ऑपरेटर अपने प्रकार के आधार पर दो वस्तुओं की तुलना करता है। 5.10 व्यवहार के लिए नीचे दिया गया चार्ट देखें (मेरा मानना ​​है कि यह व्यवहार 5.10.1 में थोड़ा बदल रहा है):

perldoc perlsyn"विस्तार से स्मार्ट मिलान" :

एक स्मार्ट मैच का व्यवहार इस बात पर निर्भर करता है कि इसके तर्क किस प्रकार के हैं। यह हमेशा सराहनीय होता है, अर्थात $a ~~ $bजैसा व्यवहार करता है $b ~~ $a। व्यवहार निम्न तालिका द्वारा निर्धारित किया जाता है: पहली पंक्ति जो लागू होती है, या तो क्रम में, मैच व्यवहार को निर्धारित करती है।

  $ $ एक प्रकार का मैच निहित मिलान कोड
  ====== ===== ====================================
  (ओवरलोडिंग ट्रम्प सब कुछ)

  कोड [+] कोड [+] संदर्भात्मक समानता $ a == $ b है   
  कोई भी कोड [+] स्केलर उप सत्य $ b -> ($ a)   

  हैश हैश कीज़ समान है [सॉर्ट कीज़% $ a] ~~ [सॉर्ट कीज़% $ b]
  हैश अर्रे हैश स्लाइस अस्तित्व grep {मौजूद $ a -> {$ _}} @ $ b
  हैश रेगेक्स हैश की ग्रीप grep / $ b /, कीज़% $ a
  हैश किसी भी हैश प्रविष्टि अस्तित्व $ मौजूद है -> {$ b}

  ऐरे सरणी सरणियां समान हैं [*]
  ऐरे रेगेक्स ऐरे ग्रीप जीआरपी / $ बी /, @ $ ए
  Array Num अरेंज में नंबर grep $ _ == $ b, @ $ a होता है 
  सरणी किसी भी सरणी में स्ट्रिंग grep $ _ eq $ b, @ $ a शामिल है 

  कोई अपरिभाषित अपरिभाषित! परिभाषित $ ए
  कोई भी रेगेक्स पैटर्न मैच $ a = ~ / $ b / 
  कोड () कोड () परिणाम $ a -> () eq $ b -> () के बराबर हैं
  कोई भी कोड () सरल बंद सत्य $ b -> () # $ अनदेखी
  संख्या संख्यात्मक [!] संख्यात्मक समानता $ a == $ b   
  कोई भी स्ट्रिंग स्ट्रिंग समानता $ एक eq $ b   
  कोई भी न्यूमेरिक इक्विटी $ a == $ b है   

  कोई भी कोई स्ट्रिंग समानता $ एक eq $ b   

+ - यह एक कोड संदर्भ होना चाहिए जिसका प्रोटोटाइप (यदि वर्तमान है) "" नहीं है
("" प्रोटोटाइप के साथ उप-कोड को 'कोड ()' प्रविष्टि के नीचे से निपटाया जाता है) 
* - अर्थात, प्रत्येक तत्व दूसरे में समान सूचकांक के तत्व से मेल खाता है
सरणी। यदि एक वृत्ताकार संदर्भ पाया जाता है, तो हम संदर्भ के लिए वापस आते हैं
समानता।   
! - या तो एक वास्तविक संख्या, या एक स्ट्रिंग जो एक संख्या की तरह दिखती है

"मेल खाने वाला कोड" वास्तविक मिलान कोड का प्रतिनिधित्व नहीं करता है, निश्चित रूप से: यह सिर्फ वहाँ है जिसका अर्थ समझा जाता है। Grep के विपरीत, स्मार्ट मैच ऑपरेटर जब चाहे शॉर्ट-सर्किट कर सकता है।

ओवरलोडिंग के माध्यम से कस्टम मिलान आप ~~ऑपरेटर को ओवरलोड करके जिस तरह से एक वस्तु का मिलान किया जाता है उसे बदल सकते हैं । यह सामान्य स्मार्ट मैच शब्दार्थ को रौंदता है। देख लो overload


यह थोड़ा नहीं बदल रहा है: यह मौलिक रूप से बदल रहा है। कुछ भी सरल के लिए स्मार्ट मिलान गंभीरता से टूट गया है।
ब्रायन डी फ़ो

1
डॉक्स को माध्य समय में बदलने के बाद से लिंक को निश्चित रूप से बदलना चाहिए। 5.14.2 वर्तमान
ब्रैड गिल्बर्ट

10
print "Matched!\n" if ($str1 eq $str2)

पर्ल ने भाषा में ढीली टाइपिंग में मदद करने के लिए स्ट्रिंग तुलना और संख्यात्मक तुलना ऑपरेटरों को अलग किया है। आपको सभी अलग-अलग ऑपरेटरों के लिए perlop पढ़ना चाहिए ।


8

इस प्रश्न का स्पष्ट उप-पहलू है:

==यदि आप दो तार समान हैं, तो आप जांच करने के लिए उपयोग क्यों नहीं कर सकते हैं?

पर्ल में टेक्स्ट बनाम संख्याओं के लिए अलग-अलग डेटा प्रकार नहीं हैं। वे दोनों "स्केलर" प्रकार से दर्शाए जाते हैं । दूसरे शब्दों में, तार कर रहे हैं संख्या अगर तुम उन्हें इस तरह के रूप में उपयोग

if ( 4 == "4" ) { print "true"; } else { print "false"; }
true

if ( "4" == "4.0" ) { print "true"; } else { print "false"; }
true

print "3"+4
7

चूंकि टेक्स्ट और नंबर भाषा द्वारा विभेदित नहीं हैं, इसलिए हम ==दोनों मामलों के लिए ऑपरेटर को सही काम करने के लिए अधिभार नहीं दे सकते । इसलिए, पर्ल eqपाठ के रूप में मूल्यों की तुलना करने के लिए प्रदान करता है:

if ( "4" eq "4.0" ) { print "true"; } else { print "false"; }
false

if ( "4.0" eq "4.0" ) { print "true"; } else { print "false"; }
true

संक्षेप में:

  • पर्ल के पास विशेष रूप से टेक्स्ट स्ट्रिंग्स के लिए डेटा-प्रकार नहीं है
  • संख्या के रूप में दो ऑपरेंड की तुलना करने के लिए उपयोग ==या!=
  • उपयोग eqया ne, पाठ के रूप में दो ऑपरेंड की तुलना करने के लिए

कई अन्य फ़ंक्शन और ऑपरेटर हैं जिनका उपयोग स्केलर मानों की तुलना करने के लिए किया जा सकता है, लेकिन इन दो रूपों के बीच अंतर जानना एक महत्वपूर्ण पहला कदम है।


जावा में एक ही समस्या है, लेकिन एक अलग कारण के लिए (और विभिन्न निहितार्थों के साथ)।
ब्रेंट ब्रैडबर्न

1

और यदि आप दो तारों के बीच अंतर निकालना चाहते हैं, तो आप स्ट्रिंग :: डिफ का उपयोग कर सकते हैं ।


यदि आप पर्ल दस्तावेज़ से लिंक करने जा रहे हैं, तो आमतौर पर पर्मलिंक्स का उपयोग करने की सिफारिश की जाती है जो हमेशा मॉड्यूल के नवीनतम संस्करण से लिंक होगी। search.cpan.org/perldoc/String::Diff search.cpan.org/perldoc?String::Diff p3rl.org/String::Diff metacpan.org/module/String::Diff metacpan.org/pod/String: : डिफ डन
ब्रैड गिल्बर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.