# Acest exemplu scoate în evidență modul în care se comportă modificatorul g (global) # atunci când este aplicată o cheie REGEX complexă. # Dacă analizăm rezultatul, pare că modificatorul g nu funcționează corect # pentru că, în această situație, se identifică mereu accgtgtttaccgttt, deși # ar trebui să poată identifica și accgtttcccacgttt la poziția 9. Însă, trebuie avut în vedere că, # g continuă întotdeauna de la poziția de la capătul șirului care a făcut match, adică accgtgtttaccgttt. # Căutarea poate să continue doar de aici și niciodată de la o poziție situată în interiorul șirului # care a făcut match, din această cauză nu poate identifica situația accgtttcccacgttt. #=pod $secv = 'accgtgtttaccgtttcccacgtttac'; print "\nÎn cazul secvenței: $secv\n"; print 'Aplicarea expresiei REGEX: /(a.c)(.+?)(t.t)(.+?)(t.t)/g',"\n"; print "Conduce la următorul rezultat:\n"; while ($secv =~ /(a.c)(.+?)(t.t)(.+?)(t.t)/g){ print 'Variabila $& s-a potrivit cu: ',"$&\n"; print 'Variabila $` s-a potrivit cu: ',"$`\n"; print 'Variabila $\' s-a potrivit cu: ',"$'\n"; print 'Variabilele $1, $2, $3, $4, $5, ',"s-au potrivit cu: $1 , $2 , $3, $4, $5\n"; } #=cut # Pentru a rezolva această problemă este necesar un algoritm specific care să determine # REGEX-ul să înceapă mereu de la o poziție controlată. Pentru a parcurge șirul în mod eficient, # în cazul în care este foarte mare, noua poziție trebuie să depindă de o anume poziție # anterior identificată. În cazul de față, o soluție ar fi utilizarea variabilei @-. În cazul # grupurilor această variabilă array se inițializează cu mai multe valori. # La indexul $-[0] întodeauna va fi păstrată poziția de început a întregului match. # La următorii indecși $-[1], $-[2] ... variabila primește, în funcție de situație, # poziția de început a match-urilor pe care le-a făcut fiecare grup. În cazul de față, # poziția grupului (a.c) este definitorie. Funcția pos() poate fi exploatată pentru a # determina REGEX-ul să pornească de la o anumită poziție. În acest caz particular este poziția la # care s-a identificat (a.c) + 3. Astfel se crează posibilitatea de a-l găsi din nou # chiar dacă a făcut parte integrantă din precedentul match. Valoarea 3 adăugată la poziția # inițială determină un salt la o nouă poziție validă în cazul unei secvențe nucleotidice. # Este evident că căutarea nu poate să continue din interiorul unui codon. # O altă soluție ar fi exploatarea directă a valorii stocate în variabila $+[1]. # Aceasta reprezintă sfârșitul grupului. Dar și în acest caz trebuie avut în vedere faptul că # mecanismul funcționează doar dacă grupul este întotdeauna format din 3 caractere (codon). $secv = 'accgtgtttaccgtttcccacgtttac'; $regex = '(a.c)(.+?)(t.t)(.+?)(t.t)'; $pozitie; $lungime; $indexmax; $secvinceput; $secvmatch; $secvsfarsit; print "\n\n"; print "Dacă se consideră: accgtgttttaccgtttcccacgttt\n"; $lungime = length($secv); $indexmax = $lungime-1; print "Această secvență are $lungime de caractere.\n"; print "Indexul la care se afla ultimul caracter este: $indexmax\n\n"; while ($secv =~ /(a.c)(.+?)(t.t)(.+?)(t.t)/g){ $secvinceput = substr($secv, 0, $-[0]); $secvmatch = substr($secv, $-[0], $+[0]-$-[0]); $secvsfarsit = substr($secv, $+[0]); print "\t",'Variabila $& s-a potrivit cu: ',"$&\n"; print "\t",'Rezultat similar cu substr($secv, $-[0], $+[0]-$-[0]), ',"$secvmatch\n"; print "\t",'Variabila $` s-a potrivit cu: ',"$`\n"; print "\t",'Rezultat similar cu substr($secv, 0, $-[0]), ',"$secvinceput\n"; print "\t",'Variabila $\' s-a potrivit cu: ',"$'\n"; print "\t",'Rezultat similar cu substr($secv, $+[0]), ',"$secvsfarsit\n\n"; print "Pozitia de inceput a intregului match: $-[0]\n"; print "Pozitia de sfarsit a intregului match: $+[0]\n"; print 'Variabilele $1, $2, $3, $4, $5, ',"s-au potrivit cu: $1 , $2 , $3, $4, $5\n"; print "Pozitia de inceput al grupurilor: $-[1] , $-[2] , $-[3] , $-[4] , $-[5]\n"; print "Pozitia de sfarsit al grupurilor: $+[1] , $+[2] , $+[3] , $+[4] , $+[5]\n"; $pozitie = $-[1] + 3; print "Cautarea va continua fortat de la pozitia: $pozitie\n\n"; pos($secv) = $pozitie; }