2013-01-22 88 views
14

मैंने हाल ही में पर्ल और रूबी में नियमित अभिव्यक्तियों के साथ फ़्लिप-फ्लॉप के बारे में सुना और पढ़ा है, लेकिन मैं यह नहीं ढूंढ पाया कि वे वास्तव में कैसे काम करते हैं और आम उपयोग के मामले क्या हैं।फ्लिप-फ्लॉप ऑपरेटर क्या है?

क्या कोई इसे भाषा-अज्ञेय तरीके से समझा सकता है?

अब जब मैं समझता हूं कि यह क्या है, और यह कैसे काम करता है, तो मैं इस सवाल को आसानी से दोहरा दूंगा: फ्लिप-फ्लॉप ऑपरेटर क्या है?

+1

बजाय यदि आप regexps मतलब है फ्लिप फ्लॉप? – choroba

+0

हाँ, यही मुझे वास्तव में पूछना चाहिए :) – samuil

उत्तर

12

पर्ल में फ्लिप-फ्लॉप ऑपरेटर सत्य का मूल्यांकन करता है जब बाएं ऑपरेंड सत्य होता है, और सही ऑपरेशन सत्य होने तक सत्य का मूल्यांकन करता रहता है। बाएं और दाएं ऑपरेंड किसी भी प्रकार की अभिव्यक्ति हो सकती है, लेकिन अक्सर इसका उपयोग रेगेक्स के साथ किया जाता है।

रेगेक्स के साथ, यह दो मार्करों के बीच सभी लाइनों को खोजने के लिए उपयोगी है। यहाँ एक सरल उदाहरण है पता चलता है कि यह कैसे काम करता है:

use Modern::Perl; 

while (<DATA>) 
{ 
    if (/start/ .. /end/) 
    { 
     say "flip flop true: $_"; 
    } 
    else 
    { 
     say "flip flop false: $_"; 
    } 
} 

__DATA__ 
foo 
bar 
start 
inside 
blah 
this is the end 
baz 

फ्लिप फ्लॉप ऑपरेटर सभी लाइनों के लिए सच हो जाएगा start से this is the end जब तक।

ऑपरेटर के दो डॉट संस्करण एक ही पंक्ति पर दोनों मैच के लिए पहले और दूसरे regex की अनुमति देता है।

foo 
bar 
start blah end 
inside 
blah 
this is the end 
baz 

आप एक ही पंक्ति से मेल करने के पहले और दूसरे regexes नहीं करना चाहते हैं, तो आप तीन उपयोग कर सकते हैं: तो, यदि आपका डेटा इस तरह देखा, उपरोक्त कार्यक्रम ही सच्चा लाइन start blah end के लिए होगा डॉट संस्करण: if (/start/ ... /end/)

ध्यान दें कि रेंज ऑपरेटर के साथ फ्लिप-फ्लॉप ऑपरेटर को भ्रमित न करने के लिए देखभाल की जानी चाहिए। सूची संदर्भ में, .. में एक पूरी तरह से अलग कार्य है: यह अनुक्रमिक मानों की एक सूची देता है। जैसे

my @integers = 1 .. 1000; #makes an array of integers from 1 to 1000. 

मैं रूबी से परिचित नहीं हूँ, लेकिन Lee Jarvis's link पता चलता है कि यह इसी तरह काम करता है।

+1

रूबी: https://gist.github.com/baa007793b683ce3c5ca –

7

यहाँ (illustrating कि रूबी पर्ल से flip_flop की तुलना में अधिक चुरा लिया) @ dan1111 के डेमो का एक सीधा रूबी अनुवाद किया गया है:

while DATA.gets 
    if $_ =~ /start/ .. $_ =~ /end/ 
    puts "flip flop true: #{$_}" 
    else 
    puts "flip flop false: #{$_}" 
    end 
end 

__END__ 
foo 
bar 
start 
inside 
blah 
this is the end 
baz 

अधिक मुहावरेदार माणिक:

DATA.each do |line| 
    if line =~ /start/ .. line =~ /end/ 
    puts "flip flop true: #{line}" 
    else 
    puts "flip flop false: #{line}" 
    end 
end 

__END__ 
foo 
bar 
start 
inside 
blah 
this is the end 
baz 
+0

ठंडा, बस पर्ल की जांच करते समय फ्लिप-फ्लॉप ऑपरेटर के बारे में पढ़ें, रूबी (मेरी स्क्रिप्टिंग भाषा पर जाएं) इसमें –

+0

फ़्लिप-फ्लॉप स्ट्रिंग के बजाए प्रत्येक 'पंक्ति' मुद्रित क्यों हुई? – onebree