• Publicidad

Ayuda con matrices de 2 dimensiones

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Ayuda con matrices de 2 dimensiones

Notapor Biokari » 2009-03-30 14:14 @634

Soy nueva por acá y he entrado justamente porque necesito ayuda en cuanto a Perl y un programa que estoy creando.

Debo decir que estoy empezando en esto y estoy un poco perdida, espero no hacer preguntas muy tontas (aunque creo que así será de todas formas).

Estoy empezando a hacer un script que tiene como finalidad tomar un archivo de nucleótidos en formato fasta y ordenarlos en una matriz. En realidad la idea es abrir el archivo, seleccionar los nucleótidos cambiar los nucleótidos por números (o caracteres como quieran llamarlo) que dé la ubicación de estos nucleótidos, de esta manera:

(el archivo en formato fasta tiene esta cara):

Código: Seleccionar todo
>sequence1
ggg---gaag   

>sequence2   
ggg---gaag

>sequence3   
gggcaggaag

>sequence4   
ggg------g

>sequence5   
ggggaacagg


Y yo transformo estas secuencias en esto (su ubicación):

Código: Seleccionar todo
A1   A2   A3   A{3-4}   A{3-4}   A{3-4}   A4   A5   A6   A7

B1   B2   B3   B{3-4}   B{3-4}   B{3-4}   B4   B5   B6   B7

C1   C2   C3   C4      C5      C6      C7   C8   C9   C10

D1   D2   D3   D{3-4}   D{3-4}   D{3-4}   D{3-4}D{3-4}  D{3-4} D4

E1   E2   E3   E4      E5      E6      E7   E8   E9   E10



Por ejemplo: A1 en la primera línea corresponde a g de la primera secuencia, y A2 a la segunda g y así sucesivamente, y cuando hay un “-“ la idea es decir que esta ausencia de nucleótido está en A entre 3-4 por eso se marca “A{3-4}“ y se repite hasta que nos encontramos con otro nuevo nucleótido y se continua el conteo.

Bueno esto es para que entiendan un poquito lo que quiero hacer.

Tengo un script que hace lo que acabo de decirles; quizás no es lo más óptimo pero me resulta por lo menos jejejeje, si alguien tiene una idea de algo mejor. El script es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w

use strict;

#declaración de variables
my ($file, $data, $fastaHeader, $nameSeq, $Seq, $cpt, $substitute, $resultat, $fileName, @data, @substitute, $col, $numCols, @rowMatrix,@matrix, $numRows, $row, @resultat, $rowMatrix );
#función para borrar el fichero con los datos viejos
sub deleteResults {
        $file="Results.txt";
        unlink ($file);
}

#función para abrir el fichero
sub openFile {
        open FD, "$fileName" or die "File not found\n";
        @data=<FD>;
        close FD;
}

#función para escribir en mi fichero de texto el nombre de la secuencia
sub changeData {
        foreach $data (@data) { #para cada valor de @data lo guarda en $data
                if ($data =~ /(>.*)/) { #si comienzo por '>', toma el carácter y todo lo que le sigue
                        $fastaHeader=$1; #guardar en la misma variable $fastaHeader
                        print $fastaHeader;#imprimir en la consola
                        open (FH, ">>Results.txt"); #crear el fichero resultado, si no existe (esto depende de la función deleteResult)
                        print FH $fastaHeader;#imprime en el fichero
                        close FH;
                }
                if ($data=~ />(.*)/) { # aquí tomo el título sin el '>' para guardar en mi fichero de texto la posición de las secuencias
                        $nameSeq=$1;
                }
                if ($data =~ /([atgc-]*)/) { #busco las secuencias
                        $Seq=$1;  
                        print "$Seq\t"; #imprime en el fichero
                        open (FH, ">>Results.txt");#escribo en el fichero de resultados
                        print FH "$Seq\t"; #imprimo las secuencias en el fichero y bajo el título
                        close FH;
                }
               
                $cpt=0;# contador para las secuencias inicializado a cero
                @substitute=split(//, $Seq);#tomo $seq y le divido en mi arreglo $substitute, las // sirven para tomar las secuencias y no los otros caracteres
                foreach $substitute (@substitute){ #para cada element0 $substitute del arreglo @substitute...
                        if ($substitute =~ /([atgc])/) { #si este elemento corresponde a un atgc...
                                $cpt+=1; #comienzo mi contador a partir de 1 y siguientes 1+1=2+1=3+1...
                                $resultat=$nameSeq."-".$cpt."; "; #mi resultado = nombre de la secuencia+un guión+le contador+";" como esto: "sequence1-1;"
                        }
                        else {
                                if ($substitute =~ /([-])/) { #pero si encuentro un gap
                                        $resultat=$nameSeq."-{".$cpt."-".($cpt+1)."}; "; #mi resultado = nombre secuencia+un guión+(contador+guión+contador+1)+";".
                                }
                        }
                       
                        print $resultat;
                        open (FH, ">>Results.txt");# escribir en el fichero resultado los $resultat
                        print FH "$resultat\t"; #apuntar en el fichero de texto
                        close FH;
                }
                print "\n";#esto es para apuntar la segunda secuencia en la segunda línea para el segundo bucle
                open (FH, ">>Results.txt");
                print FH "\n";
                close FH;
        }
       
}              
       
       
&deleteResults();

$fileName="Alignement1.txt";
&openFile();
&changeData();
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4



Bueno, este script me da lo que les mostré, pero lo que quiero es poner esto en una matriz de 2 dimensiones para poner tener líneas y columnas, porque en este ejemplo les mostré 5 secuencias alineadas (5 secuencias 1 alineamiento) y lo que debo hacer es trabajar con varios alineamientos, ¡¡¡¡¡¡¡y compararlos!!!!!!!!.

Yo había pensado poner, después de obtener mi variable $resultat lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    for ($col = 0; $col < $numCols; $col++) {
        push @rowMatrix, "0";
    }
    for ($row = 0; $row < $numRows; $row++) {
        push @resultat, [ @rowMatrix ];
        print @rowMatrix ;
    }
    print "\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero claro. que no me resulta y por eso mi presencia acá. A lo mejor ni siquiera es una buena idea, pero es que no sé qué hacer ¡¡¡¡y ya estoy volviéndome loca!!!! Seguramente es algo simple, pero yo solo conozco Perl desde hace poco.

Perdón lo largo de mi post pero quería ser lo mas clara posible.

Espero que alguien me pueda ayudar.

¡¡¡¡¡Muchas gracias de antemano!!!!!

P.D.: Ah. lo olvidaba perdón por poner los comentarios, pero están en francés; es que estudio acá en Francia.
Biokari
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-03-30 13:24 @600

Publicidad

Notapor explorer » 2009-03-30 20:00 @875

Bienvenida a los foros de Perl en Español, Biokari.

Esta es una posible solución.

Como parece que lo que interesa es generar una estructura bidimensional, he quitado la parte de guardar el resultado intermedio a fichero. Y a los elementos les he quitado el "; " final.

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

## Constantes
my $fichero_fasta = 'kk.txt';

## Variables;
my @fichero_fasta;
my @matriz;

#### Procedimiento general
abrimos_fichero();
generamos_matriz();

use Data::Dumper::Names;
print Dumper \@matriz;


#### Subrutinas
## Abrimos el fichero
sub abrimos_fichero {
    open FASTA, '<', $fichero_fasta or die "No pude leer el fichero $fichero_fasta: $!\n";
    chomp(@fichero_fasta = <FASTA>);
    close FASTA;
}

## Generamos la matriz
sub generamos_matriz {

    ## Bucle por las líneas
    my $nombre_seq;
    for my $linea (@fichero_fasta) {

        if ($linea =~ /^>(\w+)/) {
            $nombre_seq = $1;
            next;
        }

        if ($linea =~ /^([atcg-]+)/) {
            ## Bucle por las columnas
            my $contador;
            my @columnas;
            for my $columna (split //, $1) {

                if ($columna =~ /[atcg]/) {

                    $contador++;

                    push @columnas, "$nombre_seq-$contador";
                }
                else {
                    push @columnas, "$nombre_seq-{$contador-@{[$contador+1]}}";
                }
            }

            push @matriz, \@columnas;
            #print "@columnas\n";
        }
    }
}

__END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
con el fichero de ejemplo anterior, sale:
Código: Seleccionar todo
@matriz = (
            [
              'sequence1-1',
              'sequence1-2',
              'sequence1-3',
              'sequence1-{3-4}',
              'sequence1-{3-4}',
              'sequence1-{3-4}',
              'sequence1-4',
              'sequence1-5',
              'sequence1-6',
              'sequence1-7'
            ],
            [
              'sequence2-1',
              'sequence2-2',
              'sequence2-3',
              'sequence2-{3-4}',
              'sequence2-{3-4}',
              'sequence2-{3-4}',
              'sequence2-4',
              'sequence2-5',
              'sequence2-6',
              'sequence2-7'
            ],
            [
              'sequence3-1',
              'sequence3-2',
              'sequence3-3',
              'sequence3-4',
              'sequence3-5',
              'sequence3-6',
              'sequence3-7',
              'sequence3-8',
              'sequence3-9',
              'sequence3-10'
            ],
            [
              'sequence4-1',
              'sequence4-2',
              'sequence4-3',
              'sequence4-{3-4}',
              'sequence4-{3-4}',
              'sequence4-{3-4}',
              'sequence4-{3-4}',
              'sequence4-{3-4}',
              'sequence4-{3-4}',
              'sequence4-4'
            ],
            [
              'sequence5-1',
              'sequence5-2',
              'sequence5-3',
              'sequence5-4',
              'sequence5-5',
              'sequence5-6',
              'sequence5-7',
              'sequence5-8',
              'sequence5-9',
              'sequence5-10'
            ]
          );
que como ves es un arreglo que contiene arreglos (bueno, referencias a arreglos anónimos, pero podemos pensar en arreglos de arreglos).

La forma de crear la matriz es generando espacio para guardar las columnas de cada línea, en una nueva variable @columnas, en cada bucle: en la @matriz vamos guardando una referencia a esa variable (con el push()). Al finalizar el contexto del if() donde se declaró @columnas, ésta debería desaparecer, pero no lo hace porque está siendo usada por @matriz. En el siguiente bucle, se genera una nueva @columnas para guardar los nuevos valores de la siguiente línea.

Vamos, es lo mismo que hacíamos en lenguaje C y en cualquier otro en que necesitábamos reservar memoria cada vez que necesitábamos guardar algo nuevo.

Otra opción es como la que comentabas: en vez de
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
push @matriz, \@columnas;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
lo puedes cambiar por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
push @matriz, [ @columnas ];
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El resultado es el mismo, pero en este segundo caso estamos creando un arreglo anónimo y metiendo en él todos los valores de @columnas (una copia de ellos). Y luego el arreglo se "mete" dentro de @matriz. Es un poco más de trabajo para la máquina, pero inapreciable por nosotros.
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

Notapor Biokari » 2009-03-31 07:29 @353

¡¡¡¡Muchas gracias, explorer, por responder a mi post!!!!

Bueno, lo leí y mi problema es que no sé para qué sirve use Data::Dumper::Names;.

Y en la terminal me anuncia un error por lo que no puedo ejecutar el programa. El error dice:

Código: Seleccionar todo
Can't locate Data/Dumper/Names.pm in @ INC <@INC contains: C:/Perl/lib C:/Perl/site/lib .> at xxxx.pl line 17


La linea 17 es justamente
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Data::Dumper::Names;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


:cry:
Última edición por Biokari el 2009-03-31 07:37 @359, editado 1 vez en total
Biokari
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-03-30 13:24 @600

Notapor explorer » 2009-03-31 07:36 @358

Es un módulo para presentar la salida que te pongo en mi mensaje.

El error dice que no lo tienes instalado, lo cual es normal.

Si quieres ver el contenido de @matriz, cambia ese módulo por el Data::Dumper, que sí que lo tienes.
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

Notapor Biokari » 2009-03-31 08:03 @377

Estaba leyendo lo que hace ese módulo y entendí un poco lo que hace; además que también entendí que no lo tengo; mi pregunta es... ¿¿¿debo instalarlo??? y el problema es que no sé cómo hacerlo, prrrrr, perdón por ser tan básica. Durante el tiempo en que he tratado de trabajar con Perl me he encontrado con varios de estos "módulos" y no sé cómo trabajar con ellos. Sé que se declaran de la manera que tu lo haces en el script, pero no se nada más.

Para ver el contenido le puse en comentarios:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#use Data::Dumper::Names;
#print Dumper \@matriz;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y lo copie a un archivo texto para verlo mejor, y sí lo vi, jejeje, es que no entendí eso de "Si quieres ver el contenido de @matriz, cambia ese módulo por el Data::Dumper, que sí que lo tienes". O sea, ¿el Data::Dumper lo tengo o no al final? Como dices que es normal que el error diga que no lo tenga...

Otra pregunta: ¿por qué pusiste al final del script el $print "@columnas\n"; en comentario?

¡Eh! Eso, vas a tener que tener paciencia conmigo
:( espero no colmártela muy rápido.

¡¡¡¡¡¡¡Y muchas gracias!!!!!!
Biokari
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-03-30 13:24 @600

Notapor explorer » 2009-03-31 10:57 @498

El módulo Data::Dumper suele venir instalado con el Perl de tu sistema, por eso dije que ya lo tenías.

El módulo Data::Dumper::Names funciona igual que el Data::Dumper, pero ofrece salidas más bonitas.

Cuando te dije que lo cambiaras me refería a que editaras la línea que pone
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Data::Dumper::Names;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y la cambiaras a
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Data::Dumper;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Solo eso.

Data::Dumper sirve muy para cuando tienes que "ver" una estructura de datos compleja.

Para instalar un módulo, depende de tu sistema operativo. Mira este otro mensaje que lo explica.
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

Notapor Biokari » 2009-03-31 12:05 @545

Para que no creas que soy floja (jajaja) mientras esperaba una respuesta, me hice un lindo curso de instalación de módulos, jejeje. Bueno, logro instalar cualquier módulo menos el de Data::Dumper. Me dice que no retorna resultado, pero por tu respuesta veo porqué: ya estaba instalado :oops:

Bueno, cambié Data::Dumper::Names por Data::Dumper y claro, ahora sí logro ver la matriz, pero aún no sé por qué no puedo usarlo con Data::Dumper::Names.

¡¡¡¡Gracias!!!!
Biokari
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-03-30 13:24 @600

Notapor explorer » 2009-03-31 17:45 @781

Tampoco pasa nada porque no lo instales. ¿Qué error te sale?
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

Notapor Biokari » 2009-04-01 03:47 @199

El error que me sale en mi consola de comandos cuando utilizo Data::Dumper::Names es:

Código: Seleccionar todo
BEGIN failed—compilation aborted at xxx.pl line 17 (#1)
   (F) You said to do (or require, or use) a file that couldn’t be found. Perl looks for the file in all the locations mentioned in @INC, unless the file name included the full path to the file. Perhaps you need to set the PERL5LIB or PERL5OPT environment variable to say where the extra library is, o maybe the script needs to add the library name to @INC. Or maybe you just misspelled the name of this file. See perlfunc/require and lib.

Uncaught exception from user code:


Por eso pensé que necesitaba instalar Data::Dumper::Names, pero como te dije antes me sale un error de "don't return results" como si ese módulo no existiera. Pero si pido "install Data::Dumper" me da como 4 opciones y una de esas es el módulo "Data-Dumper" escrito de esa manera. Y se supone que está instalado. Luego pensé, por tu respuesta, que quizás me salia error porque decías que ya venía en Perl.

Ahora, como decía anteriormente, si solo pongo Data::Dumper me sale la matriz sin problemas.
Biokari
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-03-30 13:24 @600

Notapor explorer » 2009-04-01 04:01 @209

Como me parece que todavía estás en Windows (¡qué locura!) supongo también que estarás usando el ActivePerl.

Repasa este manual para agregar el repositorio trouchelle.com al PPM, que sí que existe ahí ese módulo.

Además, te servirá para tener acceso a miles de módulos más.
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

Siguiente

Volver a Básico

¿Quién está conectado?

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