2011-09-11 12 views
5

में नियमित अभिव्यक्ति मैं एक पाठ फ़ाइल में "CCGTCAATTC (ए | सी) टीटीटी (ए | जी) एजीटी" की घटना की तलाश में हूं।इंडेक्स फ़ंक्शन

$text = 'CCGTCAATTC(A|C)TTT(A|G)AGT'; if ($line=~/$text/){ chomp($line); $pos=index($line,$text); }

खोज काम कर रहा है, लेकिन मैं "पाठ" लाइन में की स्थिति को प्राप्त करने में सक्षम नहीं हूँ। ऐसा लगता है कि इंडेक्स एक नियमित अभिव्यक्ति को सबस्ट्रिंग के रूप में स्वीकार नहीं करता है।

मैं यह काम कैसे कर सकता हूं। धन्यवाद

उत्तर

13

@- सरणी अंतिम सफल मैच की शुरुआती स्थिति के ऑफसेट रखती है। पहला तत्व पूरे मिलान पैटर्न का ऑफसेट है, और बाद के तत्व कंटेनरयुक्त उप-पैटर्न के ऑफसेट हैं। इसलिए, यदि आप जानते हैं कि एक मैच था, तो आप इसे ऑफ़सेट $-[0] के रूप में प्राप्त कर सकते हैं।

1

आपको index का उपयोग करने की आवश्यकता नहीं है, बस एक रेगेक्स। $line का हिस्सा जो आपके रेगेक्स मैच से पहले आता है $` (या $PREMATCH में संग्रहीत किया जाएगा यदि आपने अंग्रेज़ी का उपयोग करना चुना है;)। आप $` की लंबाई की जाँच करके मैच के सूचकांक प्राप्त कर सकते हैं, और आप $& (या $MATCH) अलग-अलग से मैच में ही प्राप्त कर सकते हैं: मान लें कि आप शेष पर मिलान जारी रखने के लिए $pos प्राप्त करना चाहते हैं

$text = 'CCGTCAATTC(A|C)TTT(A|G)AGT'; 
if ($line =~ /$text/) { 
    $pos = length($PREMATCH); 
} 

$line का हिस्सा, आप $' (या $POSTMATCH) चर का उपयोग कर सकते हैं ताकि $line का हिस्सा प्राप्त हो सके जो मैच के बाद आता है।

इन विशेष चरों पर विस्तृत जानकारी के लिए http://perldoc.perl.org/perlvar.html देखें।

+0

हाँ, मैं यह कर सकता हूं। लेकिन एक बार जब मैं स्थिति को पकड़ लेता हूं तो मैं अगले 50 वर्णों को कैप्चर करना चाहता हूं: 'substr ($ line, $ pos, 50)' – Deep

+0

आप जिस तरह से कहा है, उसके साथ आप $ लाइन के शेष भाग पर मिलान कर सकते हैं - क्या वह दृष्टिकोण अवांछनीय है कुछ कारण? आप आसानी से $ लाइन के शेष हिस्से को पाने के लिए $ '(या $ POSTMATCH) चर का उपयोग भी कर सकते हैं। –

+0

कृपया मेरा संशोधित उत्तर देखें; अगर आप कुछ और ढूंढ रहे हैं तो मुझे बताएं। –

1

आपकी टिप्पणियों के आधार पर, ऐसा लगता है कि आप मैच के बाद सीधे सीधे 50 वर्णों से मेल खाते हैं। तो, एक सरल समाधान होगा:

my ($match) = $line =~ /CCGTCAATTC[AC]TTT[AG]AGT(.{50})/; 

जैसा कि आप देख, [AG]A|G के बराबर है। यदि आप कई बार मिलान करना चाहते हैं, तो आप रेगेक्स पर @matches, और /g वैश्विक विकल्प का उपयोग कर सकते हैं। जैसे

my @matches = $line =~ /CCGTCAATTC[AC]TTT[AG]AGT(.{50})/g; 

आप से मेल खाते नमूने रखने के लिए ऐसा कर सकते हैं:

my ($pattern, $match) = $line =~ /(CCGTCAATTC[AC]TTT[AG]AGT)(.{50})/g; 

या एक पाश में:

while ($line =~ /(CCGTCAATTC[AC]TTT[AG]AGT)(.{50})/g;) { 
    my ($pattern, $match) = ($1, $2); 
} 
+0

असल में, मुझे मिलान करने वाले वर्णों की आवश्यकता है इसलिए धोखा देना पड़ सकता है और 50 के बजाय 38 – Deep

+0

आपके प्रश्न को बहुत आसान नहीं किया जाएगा जवाब दें कि क्या आप शुरू से ही कहा था कि आप क्या चाहते थे? =) ठीक है, मानते हुए कि आप जानते हैं कि आप कितने पात्रों को कैप्चर करना चाहते हैं, मुझे लगता है कि आप इसे ठीक करने के तरीके से बाहर काम कर सकते हैं। – TLP

+0

इसने मुझे एक और विचार भी दिया, ताकि टीएलपी – Deep

0
while ($line =~ /(CCGTCAATTC[AC]TTT[AG]AGT)(.{50})/g;) { 

मुझे यह पसंद है, लेकिन while में कोई ;

मुझे त्रुटियों के कारण की खोज करने में कठिन समय था। T_T।

संबंधित मुद्दे