• Publicidad

Búsqueda de patrones

Perl aplicado a la bioinformática

Búsqueda de patrones

Notapor principiante » 2009-08-17 06:37 @317

¿Cómo podría hacer para buscar dentro de un fichero todas las líneas que comiencen por la palabra gen y terminen en el símbolo "/"?

Tengo el siguiente código escrito donde @fichero es donde tengo almacenado el contenido del fichero:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $linea (@fichero){
  if ($linea =~ /^gen/) {
    $union .= $linea;
  }
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


que me devuelve únicamente las líneas que comienzan por "gen". Así, por ejemplo, si fuera el siguiente caso:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
gen  12345678909853726423652836507
     237840293875
     /
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


obtengo solo la primera línea: gen 12345678909853726423652836507
y yo quiero obtener las tres líneas.

¿Cómo se podría hacer partiendo de mi código?
Última edición por explorer el 2009-08-17 06:43 @322, editado 3 veces en total
Razón: Ortografía, bloques de código, corrección del código, indentación del código
principiante
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2009-08-16 12:11 @549

Publicidad

Re: Búsqueda de patrones

Notapor explorer » 2009-08-17 06:57 @331

Puedes usar una bandera que te indique si estás dentro o no de ese bloque:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

my @fichero = (
    "otras cosas \n",
    "gen  54654767677687687687987987987998797\n",
    "     1232445646565657657693875\n",
    "     /\n",
    "otra cosa\n",
    "gen  12345678909853726423652836507\n",
    "     237840293875\n",
    "     /\n",
    "otra cosa\n",
);

my $union;
my $tenemos_gen = 0;

foreach my $linea (@fichero) {
    if ($linea =~ /^gen/) {
        $tenemos_gen = 1;
        $union = $linea;
    }
    elsif ($tenemos_gen) {
        $union .= $linea;
        if ($linea =~ /^\s+\//) {
            $tenemos_gen = 0;
            print $union;
        }
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

aunque en Perl hay una forma más abreviada de hacerlo, con la técnica del flip-flop:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

my @fichero = (
    "otras cosas \n",
    "gen  54654767677687687687987987987998797\n",
    "     1232445646565657657693875\n",
    "     /\n",
    "otra cosa\n",
    "gen  12345678909853726423652836507\n",
    "     237840293875\n",
    "     /\n",
    "otra cosa\n",
);

my $union;

foreach my $linea (@fichero) {
    if ($linea =~ /^gen/ .. $linea =~ /^\s+\//) {
        $union .= $linea;
    }
    elsif ($union) {
        print $union;
        $union = '';
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y otra forma más: con expresiones regulares, ya que estamos buscando un patrón:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $fichero = join '', @fichero;
while ($fichero =~ /^ (gen .*? \/) /gmsx) {
    print "$1\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Búsqueda de patrones

Notapor principiante » 2009-08-17 07:19 @346

En el segundo caso,en el bucle foreach() en la expresión
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($linea =~ /^gen/ .. $linea =~ /^\s+\//)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Qué significa ".." ?

Y partiendo del siguiente ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
    gen  54654767677687687687987987987998797
         1232445646565657657693875
         /7850239875080357092385
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Se podrían obtener:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
    gen  54654767677687687687987987987998797
         1232445646565657657693875
         /
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Es decir, desechar todo aquello que vaya detrás de /?

Y obtener:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
    gen  54654767677687687687987987987998797
         1232445646565657657693875
         
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Es decir: obtener desde gen hasta justo delante de "/"?

Esto ya es simple curiosidad porque el problemas ya lo tengo resuelto.
principiante
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2009-08-16 12:11 @549

Re: Búsqueda de patrones

Notapor explorer » 2009-08-17 13:20 @597

El operador '..' es eso, un operador de Perl. Se utiliza de dos formas:

a. Para crear listas de valores: my @lista = 12 .. 231;

b. Para hacer de flip-flop. En cada ciclo del bucle se comprueba la primera expresión (la del lado izquierdo). Si es falsa, el operador devuelve falso. Si es verdadera, el operador devolverá verdadero a partir de ese momento, hasta que se cumpla la expresión del lado derecho. Es como un interruptor.

Más información en el apartado Range Operators, de perldoc perlop.

En cuanto a la segunda cuestión, te basta con modificar la expresión regular:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $fichero = join '', @fichero;
while ($fichero =~ /^ (gen .*? ) \/ /gmsx) {
    print "$1\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Fíjate que dejamos fuera de los paréntesis de captura a la barra '/'. Solo es necesario ese cambio.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Búsqueda de patrones

Notapor principiante » 2009-08-17 13:24 @600

con el bucle foreach(), ¿cómo sería?
principiante
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2009-08-16 12:11 @549


Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 8 invitados