Mie Abr 26, 2006 11:26 am
|
 |
slopal
Perlero Nuevo

|
Registrado: 23 Nov 2005
Mensajes: 78
|
|
| Expresión Regular de comparación con letra comodín |
|
|
Dentro de mi programa tenía un if con la siguiente expresión:
| Código: |
| if( $var1 eq $var2) { .... } |
$var1 y $var2 sólo podían contener A, T, C o G. O sea que así perfecto...
Pero ahora he tenido que introducir un cambio: una de las dos variables,
por ejemplo $var1 puede contener caracteres comodín, representados por la letra N. Esto significa que si en $var1 encuentro una N, siempre tendría que dar cierto (en ese caracter).
No sé si me explico. Por ejemplo:
| Código: |
$var1 eq $var2 Resultado:
AT AT Cierto
AN AA Cierto
ANNT ATCT Cierto
ANNT AAAT Cierto |
¿Cómo podría crear la expresión regular que chequee esto? ¿Hay alguna forma de poner un comodin?
Supongo que tendrá que ser del tipo:
| Código: |
| if($var2 =~ m/^ ??$var1???$/) { .... } |
Tampoco se cómo incluirlo dentro de un if :$
Gracias
 |
|
|
|

Mie Abr 26, 2006 11:48 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
Se puede convertir la primera variable en una expresión regular y luego hacer la comparación:
| Código: |
$var1 =~ s/N/[ATCG]/g;
if ( $var2 =~ m/^$var1$/ ) { print "Coincidencia..." } |
Quedaría mejor salvaguardando la variable original:
| Código: |
($expreg = $var1) =~ s/N/[ATCG]/g;
if ( $var2 =~ m/^$expreg$/ ) { print "Coincidencia..." } |
Incluso hasta se puede crear una variable que sea realmente toda la expresión regular que estamos buscando:
| Código: |
($expreg = $var1) =~ s/N/[ATCG]/g;
$expreg = qr(^$expreg$);
if ( $var2 =~ $expreg ) { print "Coincidencia..." } |
|
|

Mie Abr 26, 2006 12:42 pm
|
 |
slopal
Perlero Nuevo

|
Registrado: 23 Nov 2005
Mensajes: 78
|
|
|
|
|
¡¡Que curioso!!
Lo que no se si me he explicado bien. Quiero que sean exactas las dos variables.
He probado con: | Cita: | perl -le '$var1= /'ANNNT/'; $var2= /'ATCGA/'; $var1 =~ s/N/[ATCG]/g; if($var2 =~ /^$var1$/){print"coincidenciaaaaaa"}'
coincidenciaaaaaa | ¡y me lo da por bueno! ¿Cómo podría restringirlo?
¡MIL gracias! |
|
Mie Abr 26, 2006 12:45 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
| Código: |
| perl -le '$var1= "ANNNT"; $var2= "ATCGA"; $var1 =~ s/N/[ATCG]/g; if($var2 =~ /^$var1$/){print"coincidenciaaaaaa"}' |
Habías escrito las variables con unas cuantas comillas extra, no como cadenas de caracteres
A veces es un lío si manejas unix y windows. En unix tienes que meter todo el script entre comillas simples ('), mientras que en windows es al revés.
Ultima edición por explorer el Mie Abr 26, 2006 12:51 pm, editado 1 vez |
|
Mie Abr 26, 2006 12:49 pm
|
 |
slopal
Perlero Nuevo

|
Registrado: 23 Nov 2005
Mensajes: 78
|
|
|
|
|
| explorer escribió: |
| Código: |
| perl -le '$var1= "ANNNT"; $var2= "ATCGA"; $var1 =~ s/N/[ATCG]/g; if($var2 =~ /^$var1$/){print"coincidenciaaaaaa"}' |
|
VALE... sin las /... ya decia yo  |
|
Mar May 02, 2006 11:46 am
|
 |
slopal
Perlero Nuevo

|
Registrado: 23 Nov 2005
Mensajes: 78
|
|
|
|
|
respecto al mismo tema...
necesito una manera RÁPIDA de hacer esto:
tengo una @lista = .... (que puede contener A, T, C, G y N (donde N es un comodín)).
quiero transformarlo en un hash? con las posibles listas generadas (sustituyendo la N por [ATCG]).
Me imagino una forma pero muy larga, transformandolo en $variable, haciendo joins.. luego otra vez a lista... :S
nose :S alguna idea?
(Ejemplo:
@lista = AN;
**procesamiento**
%hash = (AA, AC, AG, AT);
(AA es una lista (no una variable escalar), AC otra, AG otra...) |
|

Mar May 02, 2006 3:14 pm
|
 |
Perl user
Maestro Honorario

|
Registrado: 03 Nov 2004
Mensajes: 385
|
|
|
|
|
| slopal escribió: | respecto al mismo tema...
necesito una manera RÁPIDA de hacer esto:
tengo una @lista = .... (que puede contener A, T, C, G y N (donde N es un comodín)).
quiero transformarlo en un hash? con las posibles listas generadas (sustituyendo la N por [ATCG]).
Me imagino una forma pero muy larga, transformandolo en $variable, haciendo joins.. luego otra vez a lista... :S
nose :S alguna idea?
(Ejemplo:
@lista = AN;
**procesamiento**
%hash = (AA, AC, AG, AT);
(AA es una lista (no una variable escalar), AC otra, AG otra...) |
Que tal, no entendí la pregunta, podrías profundizar mas en ella y agregar algún ejemplo de lo que quieres realizar?
Saludos, |
|

Mar May 02, 2006 4:00 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 478
Ubicación: Frente al monitor
|
|
|
|
|
| Cita: | necesito una manera RÁPIDA de hacer esto:
tengo una @lista = .... (que puede contener A, T, C, G y N (donde N es un comodín)).
quiero transformarlo en un hash? con las posibles listas generadas (sustituyendo la N por [ATCG]).
|
Solitario he?
Bueno, creo que seria algo como esto -->
| Código: |
my @lista = qw(A B C D);
my @contenido = (1, 2, 3, 4);
my %hash;
my $i = 0;
foreach my $letra (@lista){
$hash{"$letra"} = $contenido[$i++];
}
|
Bueno, el problema es que el hash tenga mas de una equivalencia ( $hash{"Hola"} = ["Hello", "Chiao"] |
|

Mar May 02, 2006 4:24 pm
|
 |
Perl user
Maestro Honorario

|
Registrado: 03 Nov 2004
Mensajes: 385
|
|
|
|
|
| creating021 escribió: | | Cita: | necesito una manera RÁPIDA de hacer esto:
tengo una @lista = .... (que puede contener A, T, C, G y N (donde N es un comodín)).
quiero transformarlo en un hash? con las posibles listas generadas (sustituyendo la N por [ATCG]).
|
Solitario he?
Bueno, creo que seria algo como esto -->
| Código: |
my @lista = qw(A B C D);
my @contenido = (1, 2, 3, 4);
my %hash;
my $i = 0;
foreach my $letra (@lista){
$hash{"$letra"} = $contenido[$i++];
}
|
Bueno, el problema es que el hash tenga mas de una equivalencia ( $hash{"Hola"} = ["Hello", "Chiao"] |
No sé si eso era lo que preguntaban, pero si lo es, entonces tu solución no es la mas adecuada, pero no deja de ser una solución.
Te planteo una solución usando un hash slice.
| Código: |
my @lista = qw(A B C D);
my @contenido = (1, 2, 3, 4);
my %hash;
@hash{@lista} = @contenido;
|
Saludos, |
|

Mie May 03, 2006 4:21 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
A ver... yo creo que lo que quieres es recrear todas las combinaciones que aparezca la N...
El problema es sencillo si sólo aparece una vez la N en cada lista, pero complicado si aparece más de una vez.
Si ese es el caso, el que pueda aparecer más de una vez la N, estamos ante un problema de combinatoria.
Ultima edición por explorer el Mie May 03, 2006 1:53 pm, editado 1 vez |
|

Mie May 03, 2006 1:10 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
A ver con esto...
| Código: |
#!/usr/bin/perl -l
use warnings;
use strict;
my %almacen;
my @almacen;
my @bases = qw( A T C G );
my @lista = qw( AN ACGNGTCNACGCGT );
foreach my $secuencia ( @lista ) {
print "$secuencia<=";
expande_secuencia( "", $secuencia );
}
sub expande_secuencia {
# Dada dos partes de la secuencia,
# La primera no contiene ninguna N.
# Si la segunda no contiene N, la pintamos.
# Si sí tiene, divide la segunda en partes, combina y repite.
my ( $primera, $segunda ) = @_;
if ( $segunda =~ /N/ ) {
my ($media, $resto) = split('N',$segunda,2);
foreach my $base ( @bases ) {
expande_secuencia( $primera . $media . $base, $resto);
}
} else {
my $secuencia = "$primera$segunda";
print $secuencia; # Sacarlo a pantalla
$almacen{$secuencia} = 1; # Guardarlo en un hash
push @almacen, $secuencia; # Guardarlo en un array
}
} |
Salida:
| Código: |
AN<=
AA
AT
AC
AG
ACGNGTCNACGCGT<=
ACGAGTCAACGCGT
ACGAGTCTACGCGT
ACGAGTCCACGCGT
ACGAGTCGACGCGT
ACGTGTCAACGCGT
ACGTGTCTACGCGT
ACGTGTCCACGCGT
ACGTGTCGACGCGT
ACGCGTCAACGCGT
ACGCGTCTACGCGT
ACGCGTCCACGCGT
ACGCGTCGACGCGT
ACGGGTCAACGCGT
ACGGGTCTACGCGT
ACGGGTCCACGCGT
ACGGGTCGACGCGT |
Lo que no entiendo es porqué quieres guardarlo como hash. Parece que es un array lo que quieres obtener. |
|

Powered by phpBB © 2001, 2005 phpBB Group
|