2011-09-11 16 views
5

Estoy buscando la aparición de "CCGTCAATTC (A | C) TTT (A | G) AGT" en un archivo de texto.Expresión regular en la función de índice

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

buscando es trabajando, pero no soy capaz de obtener la posición de "texto" en la fila. Parece que el índice no acepta una expresión regular como subcadena.

¿Cómo puedo hacer esto? Gracias

Respuesta

13

La matriz @- contiene los desplazamientos de las posiciones iniciales de la última coincidencia exitosa. El primer elemento es el desplazamiento de todo el patrón de coincidencia, y los elementos posteriores son compensaciones de subpatrones entre paréntesis. Entonces, si sabe que hay una coincidencia, puede obtener su compensación como $-[0].

1

No necesita usar index en absoluto, solo una expresión regular. La porción de $line que viene antes de su coincidencia de expresiones regulares se almacenará en $` (o $PREMATCH si eligió usar inglés;). Usted puede obtener el índice del partido marcando la longitud de $`, y se puede obtener la tonalidad propia de la $& (o $MATCH) Variable:

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

Suponiendo que se desea conseguir $pos seguir a juego en el que queda parte de $line, puede usar la variable $' (o $POSTMATCH) para obtener la parte de $line que aparece después de la coincidencia.

Consulte http://perldoc.perl.org/perlvar.html para obtener información detallada sobre estas variables especiales.

+0

Sí, puedo hacer eso. Pero una vez que capture la posición, entonces debo capturar los siguientes 50 caracteres: 'substr ($ línea, $ pos, 50)' – Deep

+0

Puedes hacer coincidir la parte restante de $ line de la manera que dijiste: ese enfoque es indeseable para ¿alguna razón? También puede usar la variable $ '(o $ POSTMATCH) para obtener fácilmente la parte restante de $ line. –

+0

Por favor vea mi respuesta enmendada; avísame si estás buscando algo más. –

1

En función de sus comentarios, parece que lo que busca es unir los 50 caracteres directamente después del partido. Por lo tanto, una solución sencilla sería:

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

Como se ve, [AG] es equivalente a A|G. Si desea hacer coincidir varias veces, puede usar una matriz @matches y la opción global /g en la expresión regular. P.ej.

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

Esto se puede hacer para mantener la coincidencia de patrones:

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

O en un bucle:

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

En realidad, necesito los caracteres correspondientes, así que puede que tenga que hacer trampa y en lugar de poner 50 38 – Deep

+0

¿No habría sido mucho más fácil su pregunta? responde si dijiste desde el principio lo que querías? =) Bueno, suponiendo que sabes cuántos caracteres quieres capturar, creo que puedes encontrar la manera de solucionarlo. – TLP

+0

Esto también me dio otra idea, por lo que TLP – Deep

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

me gusta, pero no ; en while.

Tuve tiempos difíciles para buscar el motivo de los errores. T_T.

Cuestiones relacionadas