Página 1 de 1

Cómo pasar de "Variable" a "Lista"

NotaPublicado: 2005-12-05 11:43 @530
por slopal
Me refiero a que si por ejemplo tengo una variable:

$cadena = "ATCGTCATGC";

necesito acceder "cómodamente" y varias veces sin cambiar el contenido de la cadena a diferentes posiciones: cadena[2], cadena[3], etc...

Esto lo podría hacer si la cadena fuera una lista pero es un parámetro de entrada...¿ hay una forma fácil de transformar una variable en una lista? ¿O alguna forma de acceder que no haya sabido ver en los tutoriales? :S

Muchas gracias... (es mucho más sencillo de como lo he explicado, sorry :s)

NotaPublicado: 2005-12-05 12:37 @567
por Perl user
¿Qué tal?

Lo mas sano ( sencillo y rápido ) sería utilizar substr. De esta manera, puedes acceder no solo a una sola posición, sino a una subcadena completa o incluso modificarla utilizándolo como lvalue:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $str = 'foo bar baz';
  2. my $f   = substr( $str, 0, 1 ); # extrae 'f'
  3. my $b   = substr( $str, 4, 1 ); # extrae 1 carácter desde la posición 4: 'b'
  4. my $foo = substr( $str, 0, 3 ); # extrae 'foo'
  5. my $bar = substr( $str, 4, 3 ); # extrae 'bar'
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Ahora bien... si quisieras representar tu cadena como un objeto similarmente a como lo hace Java y poder tener operaciones propias para manipularlo, puedes utilizar el módulo String:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $str = String->new( "foo bar baz" );
  2. print $str->charAt( 4 ); # imprime 'b'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Saludos,

NotaPublicado: 2005-12-05 12:44 @572
por explorer39
Puedes crear una nueva variable, un array, con una representación, en lista, de los caracteres de la variable.

Si además la llamas de la misma manera, mejoras el entendimiento del programa, siempre y cuando tengas luego muy claro cuál quieres modificar y cuál no.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $cadena = "ATCGTCATGC";
  2. my @cadena = split //, $cadena;
  3. print $cadena[1]; # T
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Si vas a manejar secuencias de ADN, supongo que estarás usando el paquete BioPerl...

NotaPublicado: 2005-12-05 12:56 @581
por slopal
¡¡¡Muchas gracias a los dos!!!

Utilizaré la segunda opción con split() :)

¡¡Sois unos cielos!!

P.D.: gracias por el BioPerl :P ¡¡Me lo miro ahora mismo!! Aun estoy muuuy verde :oops:

NotaPublicado: 2005-12-05 13:34 @607
por explorer39
Se podría hacer así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Bio::Seq;
  2.  
  3. # crear secuencia
  4. $seqobj = Bio::PrimarySeq->new (
  5.     -seq => 'ATCGTCATGC',
  6.     -id  => 'GeneFragment-12',
  7.     -accession_number => 'X78121',
  8.     -alphabet => 'dna',
  9.     -is_circular => 1
  10. );
  11. print $seqobj->seq();       # ATCGTCATGC
  12. print $seqobj->subseq(4,7); # GTCA
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4