मैं पर्ल में दो तारों की तुलना कैसे करूं?
मैं पर्ल सीख रहा हूं, मेरा यह मूल प्रश्न था कि इसे स्टैकऑवरफ्लो पर यहां देखा गया और कोई अच्छा जवाब नहीं मिला, इसलिए मैंने सोचा कि मैं पूछूंगा।
मैं पर्ल में दो तारों की तुलना कैसे करूं?
मैं पर्ल सीख रहा हूं, मेरा यह मूल प्रश्न था कि इसे स्टैकऑवरफ्लो पर यहां देखा गया और कोई अच्छा जवाब नहीं मिला, इसलिए मैंने सोचा कि मैं पूछूंगा।
जवाबों:
पेरलोक पेरलोप देखें । का प्रयोग करें lt
, gt
, eq
, ne
, और cmp
स्ट्रिंग तुलना के लिए उपयुक्त के रूप में:
eq
यदि सही तर्क सही तर्क के बराबर है तो बाइनरी रिटर्न सही है।
ne
अगर सही तर्क के बराबर नहीं है तो बाइनरी रिटर्न सही है।द्विआधारी
cmp
रिटर्न -1, 0, या 1 इस बात पर निर्भर करता है कि बाएं तर्क, सही तर्क की तुलना में कम, के बराबर या अधिक कठोर है।बाइनरी
~~
अपने तर्कों के बीच एक स्मार्टमैच करता है। ...
lt
,le
,ge
,gt
औरcmp
मिलान (प्रकार) आदेश वर्तमान स्थान द्वारा निर्दिष्ट का उपयोग करता है, तो एक विरासत उपयोग स्थल (लेकिनuse locale ':not_characters'
) प्रभाव में है। पेरोलोकेल देखें । केवल यूनीकोड के साथ इनको न मिलाएं, केवल विरासत बाइनरी एनकोडिंग के साथ। मानक यूनिकोड :: Collate और Unicode :: Collate :: लोकेल मॉड्यूल टकराव के मुद्दों के लिए अधिक शक्तिशाली समाधान प्रदान करते हैं।
index
यह देखने के लिए उपयोग करता है कि क्या एक स्ट्रिंग दूसरे का एक विकल्प है।
!=
और ne
समान नहीं हैं, क्योंकि !=
और ne
भिन्न होने के लिए परिभाषित हैं। कितना कठिन है ?! एक संख्यात्मक तुलना ऑपरेटर होने के नाते, !=
अपने दोनों ऑपरेंड को संख्याओं में परिवर्तित करता है perl -E 'say "equal" if not "a" != "b"'
।
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
। ये वही मान हैं जो आप करेंगे) हमेशा पर्ल में बूलियन ऑपरेटरों से प्राप्त करें। आपको वास्तव में केवल बूलियन या न्यूमेरिक ऑपरेशंस के लिए रिटर्न वैल्यू का उपयोग करना चाहिए, जिसमें अंतर वास्तव में मायने नहीं रखता है।)
eq
, के लिए वापसी मान gt
, lt
आदि सही नहीं हैं ... वे सही या गलत लौटाते हैं। केवल cmp
विशिष्ट संख्यात्मक मान लौटाता है।
leg
इसके बजाय इसका उपयोग करता है cmp
जिसके बजाय सामान्य तुलना के लिए उपयोग किया जाता है।
स्ट्रिंग तुलना संचालकों की व्यापक लिस्टिंग सिनान 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
।
print "Matched!\n" if ($str1 eq $str2)
पर्ल ने भाषा में ढीली टाइपिंग में मदद करने के लिए स्ट्रिंग तुलना और संख्यात्मक तुलना ऑपरेटरों को अलग किया है। आपको सभी अलग-अलग ऑपरेटरों के लिए perlop पढ़ना चाहिए ।
इस प्रश्न का स्पष्ट उप-पहलू है:
==
यदि आप दो तार समान हैं, तो आप जांच करने के लिए उपयोग क्यों नहीं कर सकते हैं?
पर्ल में टेक्स्ट बनाम संख्याओं के लिए अलग-अलग डेटा प्रकार नहीं हैं। वे दोनों "स्केलर" प्रकार से दर्शाए जाते हैं । दूसरे शब्दों में, तार कर रहे हैं संख्या अगर तुम उन्हें इस तरह के रूप में उपयोग ।
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
, पाठ के रूप में दो ऑपरेंड की तुलना करने के लिएकई अन्य फ़ंक्शन और ऑपरेटर हैं जिनका उपयोग स्केलर मानों की तुलना करने के लिए किया जा सकता है, लेकिन इन दो रूपों के बीच अंतर जानना एक महत्वपूर्ण पहला कदम है।
और यदि आप दो तारों के बीच अंतर निकालना चाहते हैं, तो आप स्ट्रिंग :: डिफ का उपयोग कर सकते हैं ।