Problema split con patrón repetitivo
Publicado: 2015-08-10 03:58 @207
Buenos días a todos.
El problema que tengo es que estoy usando una expresión del tipo:
Según tengo entendido, mediante esta línea voy metiendo en el array los diferentes elementos resultantes de cortar $secuencia en función de $patron.
Cuando el patrón es, por ejemplo: 'BB' y la secuencia es 'BBBBBB' se produce un error y no se reconoce bien.
Si cojo como patrón 'BI' entonces sí funciona bien: corta 'BI-BBBB' y cuenta la primera letra del fragmento 'BBBB'.
¿Alguien sabe cómo solucionarlo o por qué ocurre?
Os pego el código completo. La secuencia está en un archivo txt que es llamado y es 'BIBBBB'. Si el patrón es 'BB', ¡no cuenta bien!
El problema que tengo es que estoy usando una expresión del tipo:
Según tengo entendido, mediante esta línea voy metiendo en el array los diferentes elementos resultantes de cortar $secuencia en función de $patron.
Cuando el patrón es, por ejemplo: 'BB' y la secuencia es 'BBBBBB' se produce un error y no se reconoce bien.
Si cojo como patrón 'BI' entonces sí funciona bien: corta 'BI-BBBB' y cuenta la primera letra del fragmento 'BBBB'.
¿Alguien sabe cómo solucionarlo o por qué ocurre?
Os pego el código completo. La secuencia está en un archivo txt que es llamado y es 'BIBBBB'. Si el patrón es 'BB', ¡no cuenta bien!
Using perl Syntax Highlighting
- print "Introduzca el nombre del archivo que contiene la secuencia a analizar: ";
- $secuencia = <STDIN>;
- chomp $secuencia;
- # abrir el archivo
- unless(open(ARCHIVOSECUENCIA,$secuencia)){
- print "No podemos abrir ese archivo. Recuerde que debe ser del tipo *.txt!! \n\n";
- exit;
- }
- # leer el archivo con un array
- @SECUENCIA = <ARCHIVOSECUENCIA>;
- chomp @SECUENCIA;
- close ARCHIVOSECUENCIA;
- # pasar dicho array a single String para remove newline and white space
- $SECUENCIA = join('',@SECUENCIA);
- #$SECUENCIA =~s/\s//g;
- # volver a pasar este Single String a Array donde cada caracter sea un elemente en el array
- #@SECUENCIA= split('',$SECUENCIA);
- #PASAMOS A DETERMINAR EL PATRÓN A BUSCAR
- print "\n\n";
- print "¿Qué patrón quieres buscar?";
- my $patron=<STDIN>;
- chomp $patron;
- $patron=~s/\s//g; #removemos los espacio en blanco
- #cortamos la secuencia por en cada punto donde existe el patrón buscado
- print "imprimo el valor de patrón:", "$patron","\n\n";
- print "ESTOS SON LOS FRAGMENTOS CORTADOS SEGÚN EL PATRON \n\n";
- #------------------------------------------------
- #--------------------------------------------------
- my @conjunto=split $patron,$SECUENCIA; #metemos la secuencia del String en un array donde cada elemento es un corte según el patrón
- shift(@conjunto); #eliminamos el primer trozo para que no interfiera en el cálculo
- #unshift(@conjunto,$patron);
- $numero_elementos=scalar(@conjunto);
- # Crear CUATRO contadores para los diferentes estados que puede tener S,B,I,Error
- $S_count = 0;
- $B_count = 0;
- $I_count = 0;
- $error_count = 0;
- foreach $elemento(@conjunto){ #bucle que recorre toda la secuencia contenida en el array @conjunto
- $elemento=$elemento.$patron; # al realizar el corte, la secuencia queda cortada y se elimina el patrón de corte. Con esta
- # línea volvemos a pegar el patrón al final del fragmento cortado para que la secuencia sea fiel a la original
- if (length($elemento)<1) { # Si al realizar el corte hay dos patrones consecutivos son eliminados y el fragmento queda vacío, en ese caso
- # decimos que ese fragmento vacío es el patrón
- $elemento=$patron
- };
- print $elemento;
- $primer_elemento=substr($elemento,0,1);
- print " el primer elemento es: ", $primer_elemento, "\n";
- if ($primer_elemento eq 'S'){
- ++$S_count;
- }elsif($primer_elemento eq 'B'){
- ++$B_count;
- }elsif($primer_elemento eq 'I'){
- ++$I_count;
- }else{
- print "!!!!!!!Error - I don\'t recognize this base : $primer_elemento\n";
- ++$error_count;}
- }
- print "\n\n";
- print "LOS RESULTADOS SON LOS SIGUIENTES:\n";
- print"______________________________________\n\n";
- print "Sube = $S_count\n";
- print "Baja = $B_count\n";
- print "Igual = $I_count\n";
- print "\n\n";
- print "SACAMOS LOS PORCENTAJES:\n";
- print"_____________________________\n\n";
- $total=$S_count+$B_count+$I_count;
- if ($total==0) {
- print "No se ha encontrado ninguna concordancia \n";
- }else{
- $porcentaje_B=((100*$B_count)/$total);
- $porcentaje_S=((100*$S_count)/$total);
- $porcentaje_I=((100*$I_count)/$total);
- print " Porcentaje de B: ",$porcentaje_B, "%\n";
- print " Porcentaje de S: ",$porcentaje_S, "%\n";
- print " Porcentaje de I: ",$porcentaje_I, "%\n";
- }
- exit;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4