• Publicidad

Numeración en Perl

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

Numeración en Perl

Notapor afry » 2008-08-28 11:31 @522

Hola, tengo otro problema en el mismo programa y es que me tiene que devolver un montón de cabeceras seguidas de distintas secuencias de ADN pero no consigo que me salgan numeradas.
El resultado correcto es:
Código: Seleccionar todo
>1-100000_1 [23 - 121] (titulo1)
(secuencia)
>1-100000_2 [84 - 143] (titulo2)
(secuencia)


A mí me sale:
Código: Seleccionar todo
>1-100000_ [23 - 121] (titulo1)
(secuencia)
>1-100000_ [84 - 143] (titulo2)
(secuencia)


Creo que el fallo está en esta línea del programa:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$entrada= ">1-100000_ [$variable-$variable{$variable}] $variable $variable \n\n";
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


No sé qué puedo añadir para que me salga la numeración de cada cabecera entre el guion y los corchetes.

Muchas gracias
afry
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2008-07-05 13:43 @613

Publicidad

Notapor explorer » 2008-08-28 11:50 @535

Debes crear, al principio del programa, una variable, que lleve el contador de secuencias mostradas.

Al principio, pones
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $num_sec = 1;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

y luego, dentro del bucle que pinta las secuencias,
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$entrada= ">1-100000_$num_sec [$variable-$variable{$variable}] $variable $variable \n\n";
$num_sec++;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Así se va indicando y autoincrementando, por cada secuencia.
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 afry » 2008-08-28 15:01 @667

Hola de nuevo. Ese código no me funciona porque primero tengo que realizar la lectura de una secuencia de ADN y posteriormente tengo que realizar la lectura de su inversa. La numeración tiene que ser seguida, es decir, del 1 al 1000 por ejemplo y lo que me ocurre es que la lectura de la secuencia normal me marca del 1 al 30 y para la inversa debería seguir numerando el 31 y empieza de nuevo en 1. ¿¿¿Me explico??? Así que supongo que tendré que utilizar alguna otra variable nueva...

Muchas gracias
afry
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2008-07-05 13:43 @613

Notapor explorer » 2008-08-28 15:14 @676

A ver... no podemos darte instrucciones detalladas sin tener, al menos, una visión global del programa.

En la solución que te comenté antes, te dije que crearas la variable al principio del programa, por lo que entonces se convierte en un variable global.

No nos dices cómo realizas las operaciones con las dos secuencias. Solo dices que primero procesas una secuencia y luego la inversa, pero no nos dices cómo. ¿En una subrutina o a lo largo del programa principal?. Si es en el segundo caso, el uso de una variable global te debería bastar. Y en el caso de ser subrutinas, también. Salvo que esas subrutinas estén en otro módulo. En ese caso tienes dos opciones.

La primera, es pasar la variable contador en uno de los argumentos de las subrutinas. Y la otra, convertir la variable contador en un variable global.

Para esto último, debes hacer lo siguiente. En el programa principal, cambia el 'my' de la variable por un 'our'. Y en el módulo donde tienes las subrutinas, la declaras al principio del módulo (un 'our $variable_contador;' al principio).
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 afry » 2008-08-29 05:11 @258

Tengo este else dentro de un bucle for y no sé cómo hacer que me aparezcan numeradas del uno al 1000 por ejemplo. Como dije me numera las cabeceras de la secuencia normal empezando a numerar desde 1 de nuevo las de la inversa.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
else {
    $trozo= substr($adn,$posicionE,$diferencia);
    print FICHERO"\>1-100000_";
    if ($d==1) {
        print FICHERO "[";
        print FICHERO 100000-$posicionE;
        print FICHERO "-";
        print FICHERO 100000-$posicionS+1;
        print FICHERO "]";
        print FICHERO "(REVERSE SENSE)";
        print FICHERO $cab;
        print FICHERO $trozo;
        print FICHERO "\n";
        print FICHERO "\n";}
    else {
        print FICHERO "[";
        print FICHERO $posicionE+1;
        print FICHERO "-";
        print FICHERO $posicionS;
        print FICHERO "]";
        print FICHERO $cab;
        print FICHERO $trozo;
        print FICHERO "\n";
        print FICHERO "\n";}
        $contador = ++$contador;
    }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Muchas gracias
afry
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2008-07-05 13:43 @613

Notapor explorer » 2008-08-29 05:41 @279

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
else {
    $trozo= substr($adn,$posicionE,$diferencia);

    print FICHERO"\>1-100000_$contador";
    $contador++;

    if ($d==1) {
        print FICHERO "[";
        print FICHERO 100000-$posicionE;
        print FICHERO "-";
        print FICHERO 100000-$posicionS+1;
        print FICHERO "]";
        print FICHERO "(REVERSE SENSE)";
        print FICHERO $cab;
        print FICHERO $trozo;
        print FICHERO "\n";
        print FICHERO "\n";}
    else {
        print FICHERO "[";
        print FICHERO $posicionE+1;
        print FICHERO "-";
        print FICHERO $posicionS;
        print FICHERO "]";
        print FICHERO $cab;
        print FICHERO $trozo;
        print FICHERO "\n";
        print FICHERO "\n";}
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

* Hay que actualizar el print para que saque el valor del $contador
* El $contador estaba mal puesto, debe ser fuera del if que decide la orientación de la secuencia
* El problema más grave está sin resolver aquí: la inicialización de la variable a 1. Si este trozo de código corresponde a una subrutina, pásale el valor de $contador como un argumento más, para que sepa a partir de qué valor debe pintar. Y la última instrucción de ella que sea un return $contador; para que informe al programa principal cuánto a pintado.

En resumen:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
## Programa principal

#[...]

my $contador = 1;

#[...]

## Pintamos la secuencia en el orden normal (d == 1)
$contador = pinta_secuencia(..., $contador);

## Pintamos la secuencia en el orden inverso (d != 1)
$contador = pinta_secuencia(..., $contador);
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Subrutina
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub pinta_secuencia {
    my ( ..., argumentos, ..., $contador ) = @_;

#[Pintado de la secuencia, lo indicado más arriba]

    return $contador;
{
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Naturalmente, hay más formas de hacerlo.
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 afry » 2008-08-29 06:00 @291

¿No hay algo más sencillo que me evite el tener que crear más subrutinas?
afry
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2008-07-05 13:43 @613

Notapor explorer » 2008-08-29 06:57 @331

Yo no he hablado de crear más subrutinas... he dicho "modificar la que usas para imprimir las secuencias".

Si el proceso de pintado lo haces en una subrutina aparte, debes indicarle de alguna manera qué valor de $contador debe usar. El pasarlo como argumento es una de las formas más sencillas e inmediatas.
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 afry » 2008-08-29 09:16 @428

¿Entonces tengo que sustituir lo que te he mandado por lo que me has enviado? ¿El primer recuadro iría en el programa principal y la subrutina en el módulo?
afry
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2008-07-05 13:43 @613

Notapor explorer » 2008-08-29 12:53 @578

Claro, pero cambiando los nombres de la subrutina a la que estás usando en tu programa...
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


Volver a Básico

¿Quién está conectado?

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

cron