• Publicidad

Format o como se haga

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

Format o como se haga

Notapor ElCidJJ » 2008-09-01 15:14 @676

Hola de nuevo, me presento aquí con una nueva duda:

Un ejercicio que tengo que hacer me exige esto:

Necesito visualizar el contenido de un fichero que cada línea contiene el siguiente formato:

Código: Seleccionar todo
ID MIN HORA DÍA MES DÍA-SEMANA ORDEN


si el fichero contiene este contenido:

Código: Seleccionar todo
1 04 16 * * * diario/S12kbd
2 04 16 * * * diario/S14smbfs
3 04 16 * * * diario/S10nfs
4 04 16 * * * diario/S12running-kernel


El resultado que debe producir es la visualización para cada línea del fichero de esta forma, en la salida estándar, vamos en la terminal:

Código: Seleccionar todo
FICHERO:
EJECUCIÓN: DIARIA/SEMANAL/MENSUAL
HORA:
MINUTO:
DIA:
MES:
DIA DE LA SEMANA:


Si aparece un * en un campo del fichero debe mostrarse la cadena CUALQUIERA en lugar del valor correspondiente.

Por lo que al escribir la orden al Perl debería de mostrar por pantalla una cosa parecida:

Código: Seleccionar todo
FICHERO: S12kbd
EJECUCIÓN: DIARIA
HORA: 16
MINUTO: 04
DIA: CUALQUIERA
MES: CUALQUIERA
DIA DE LA SEMANA: CUALQUIERA


y así sucesivamente...

Creo, he mirado por ahí, que hay una función llamada format que te muestra los contenidos de un fichero manteniendo un formato. Yo, como buenamente e intentado comprender lo he hecho de esta manera, pero me salen errores por todos sitios:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
   #Abro el fichero para lectura
         open(MANEJADOR_FICHERO, "fichero.txt") or die "No se puede abrir el fichero.txt. $!\n";       

#           Recorro el contenido del fichero
            while ($num=<MANEJADOR_FICHERO>)
             {

                @vector=split / /,$num;
# guardo cada campo de cada linea en un vector
             }

format MANEJADOR_FICHERO =
                FICHERO:
                @vector[6]
                EJECUCION:
                @vector[0]
                HORA:
                @vector[2]
                MINUTO:
                @vector[1]
                DIA:
                @vector[3]
                MES:
                @vector[4]
                DIA DE LA SEMANA:
                @vector[5];
                write MANEJADOR_FICHERO;

            #Cerramos el fichero
            close (MANEJADOR_FICHERO) or die "No se puede cerrar el fichero de planificacion1.txt. $! \n";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Creo, he leído por ahí, que lo del formato lo guarda en un fichero, y yo quiero mostrarlo por la terminal, lo que podría hacer es establecer el formato, guardar todo en un fichero y luego mostrar ese fichero con todas los contenidos ya ordenados en ese formato... Es que no sé cómo se hace, o si hay una forma más sencilla.

Obviamente o no tan obviamente, esto me da un montón de errores; está claro que no tengo ni idea de cómo es... lo que quiero evitar es poner cada campo en una línea recorrida por un for
Código: Seleccionar todo
for(...)
...
print("HORA: @vector[3]");
print("MINUTO: @vector[2]");
...

Y ASI sucesivamente

Si no se puede hacer de otra manera, habrá que hacerlo así...

NO tengo ni idea en esto, a lo mejor parezco un burro, pero al menos intento sacarlo por mi cuenta, pero cuando ya llego al límite pido ayuda.

Bueno, gracias por la ayuda y espero que me entendáis. Un Saludooo Grande y hermoso.
ElCidJJ
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2008-08-19 07:38 @360

Publicidad

Notapor explorer » 2008-09-01 16:44 @739

Primero, quedas castigado a escribir 1000 veces: "No volveré a confundir @vector[6] con $vector[6]". Por favor, que son cosas DISTINTAS. A ver si vas a suspender por una tontería así...

En cuanto al problema, te ha faltado lo principal: indicar el formato.

Aquí tienes un ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
        1 #!/usr/bin/perl
        2 use strict;
        3 use warnings;
        4 use diagnostics;
        5
        6 use constant {
        7     ID          => 0,
        8     MIN         => 1,
        9     HORA        => 2,
       10     DIA         => 3,
       11     MES         => 4,
       12     DIASEMANA   => 5,
       13     ORDEN       => 6,
       14 };
       15
       16 my @vector;
       17
       18 format =
       19 FICHERO: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       20          $vector[ORDEN]
       21 EJECUCION: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       22            $vector[ID]
       23 HORA: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       24       $vector[HORA]
       25 MINUTO: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       26         $vector[MIN]
       27 DIA: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       28      $vector[DIA]
       29 MES: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       30      $vector[MES]
       31 DIA DE LA SEMANA: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       32                   $vector[DIASEMANA]
       33
       34 .
       35
       36 while (<DATA>) {
       37     @vector = split " ";
       38
       39     $vector[ID       ] = 'DIARIA';
       40     $vector[ID       ] = 'SEMANAL'    if $vector[DIASEMANA] ne '*';
       41     $vector[ID       ] = 'MENSUAL'    if $vector[DIA]       ne '*';
       42     $vector[ORDEN    ] = $1           if m{([^/]+)$};
       43     $vector[DIA      ] = 'CUALQUIERA' if $vector[DIA]       eq '*';
       44     $vector[MES      ] = 'CUALQUIERA' if $vector[MES]       eq '*';
       45     $vector[DIASEMANA] = 'CUALQUIERA' if $vector[DIASEMANA] eq '*';
       46
       47     write;
       48 }
       49
       50 __DATA__
       51 1 04 16 * * * diario/S12kbd
       52 2 04 16 2 * * diario/S14smbfs
       53 3 04 16 * * 4 diario/S10nfs
       54 4 04 16 * 3 * diario/S12running-kernel
       55
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Algunos detalles:
* El formato lo hemos definido una vez, fuera del bucle
* El formato no tiene manipulador asociado, así que por defecto sale hacia el STDOUT. En tu programa estabas enviando la salida de write() hacia el mismo fichero que estabas leyendo. Deberían ser DISTINTOS
* Uso "use constant" para facilitar el acceso dentro del array
* Seguro que el cálculo de lo que es diario, semanal o mensual, no está bien hecho. Esto solo es una "prueba de concepto" :)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor ElCidJJ » 2008-09-02 07:07 @338

Ya lo hice, me ha quedado muy bien, el error consistia en que al copiar el codigo de aqui al kate, habia caracteres que no reconocia, y bueno aunque me he llevao toda la tarde, ya hice el problemita

Gracias por la ayuda, me sirvio mucho para enterarme de como se utilizaba el format.

De nuvo Graciaaas
Última edición por ElCidJJ el 2008-09-02 17:30 @770, editado 1 vez en total
ElCidJJ
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2008-08-19 07:38 @360

Notapor explorer » 2008-09-02 08:12 @383

Se nota que has copiado y pegado el castigo, y algo peor... no lo has ejecutado... Así que el castigo se mantiene.

En cuanto al error que te sale, puede ser debido a algún acento. Prueba a sacar primero el formato sin acentos, como he hecho yo. Luego, ya veremos cómo sacarles.

En cuanto al fichero de entrada, veo que a veces hay un espacio en blanco entre las palabras "diario", "semanal" y "mensual" con el comando a ejecutar.

Lo del format ya sabes que puedes ponerlo fuera del bucle. Irá más rápido y te quedará más limpio el programa.

Y sin ver cómo lo estás haciendo, será difícil ver dónde está el fallo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
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 0 invitados

cron