• Publicidad

Duda if

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

Duda if

Notapor ElCidJJ » 2008-08-20 09:19 @429

Hola de nuevo, aquí me presento con una duda, que no sé si es de Perl muy bien o no, lo que ocurre es que tengo la cabeza ya como un bombo y no sé ni por dónde atacar.

Tengo que comparar, en mi programa, el contenido de dos ficheros de la siguiente manera: Comprobar que un elemento del fichero 1 esté en el fichero 2, para ello por cada elemento del fichero 1 tengo que compararlo con todos los del fichero 2 y así con cada elemento del fichero 1. Si no está se copiará en el fichero 2 y si está pues sigue leyendo. Mi duda radica en cómo guardar los elementos que no sean iguales, sin incluir el que sea igual.

Muestro aquí mi código, lo explico más o menos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach $tarea_que_pueden_entrar (@tareas_aceptadas2) {
    #En $tarea_que_pueden_entrar guardo los elementos del fichero 1 para comparar

    for ($x=0; $x<$numero_de_elementos_en_el_fichero_2; $x++) {

        $comp = $tareas_repetidas2[$x];
        chop($comp);

        #en $comp los elementos del fichero2

        if ($tarea_que_pueden_entrar ne $comp) {
            print("Son Distintos ");
            #aquí no sé qué hacer para que cuando sean distintos
            #salga de este if, del for y se grabe la tarea en el fichero 2
        }
        else {
            print("Son iguales ");
        }
    }
    if (son distintos) {
        print MANEJADOR_FICHERO "$tarea_que_pueden_entrar\n";
    }
    else {
        print("Como son = no se ha copiado \n");
    }
}
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Espero que esté claro y que me podáis ayudar. Un saludo de nuevo y muchísimas gracias por todo.
ElCidJJ
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2008-08-19 07:38 @360

Publicidad

Notapor explorer » 2008-08-20 12:05 @545

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 ElCidJJ » 2008-08-21 06:49 @325

No, me confundí. Lo que comparo es el contenido de un directorio con los de un fichero. Quiero saber si el nombre de los archivos que hay en un directorio son iguales al último elemento de cada línea de un fichero.

El caso es... lo que hay en el directorio son una serie de scripts ejecutables y el fichero se llama planificacion.txt; en ese fichero guardo la hora, el día... y el script que se quiere ejecutar. Se guarda una línea por script. Pero si el script ya está en ese fichero registrado para ejecutarse, no tengo que volverlo a poner, y si no está, pues sí.

La cosa es comparar cada archivo que hay en el directorio con el último elemento de cada línea del fichero y no sé cómo hacerlo :(

No sé si con vectores o con hashes, el caso es que todos los nombre de los archivos del directorio los guardo en un vector, luego compruebo sus permisos y guardo en otro vector los que tienen los permisos indicados. Con este último vector es con el que tengo que trabajar.

A ver si me podéis ayudar. Graciaaas.
ElCidJJ
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2008-08-19 07:38 @360

Notapor explorer » 2008-08-21 07:35 @357

Pero... realmente, si lo he entendido, no es comparar la última línea del fichero planificacion.txt con la lista de scripts, sino que lo que quieres es que planificacion.txt contenga una línea por cada script presente en el directorio.

¿No? ¿O es que la posición final del fichero planificacion.txt es importante?
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 ElCidJJ » 2008-08-21 09:17 @428

El nombre de los scripts son:

S12kbd, S14smbfs, S10nfs, S12running-kernel, S17hal ... por ejemplo

Y el contenido del fichero planificacion.txt es el siguiente

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


Quiero comparar los nombres de los scripts con cada línea del fichero para ver si se encuentra ya registrado, o sea hago un split del último campo separado por / y pillo el nombre de la tarea en el fichero. Si no lo está, pues se registra.

Por ejemplo, el script S17hal no está en el fichero de planificación por lo tanto entraría, los demás como ya están, no entran.

Un Saludo y Graciaaas.
ElCidJJ
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2008-08-19 07:38 @360

Notapor explorer » 2008-08-21 14:18 @638

A mí me ha salido una solución, creo que muy larga, pero espero que más clara...

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

chdir 'diario';

my @planificacion = do { open PLANI, "<planificacion.txt" or die "$!\n"; <PLANI> };
chomp @planificacion;

my @minuto_de_arranque;
my %scripts_puestos;

for my $linea (@planificacion) {
    my ($minuto, undef, undef, undef, undef, undef, $fichero_script) = split(" ", $linea);
    my (undef, $script) = split("/", $fichero_script, 2);

    $scripts_puestos{$script} = $minuto;
    $minuto_de_arranque[$minuto] = $script;
}

for my $script (<S*>) {
    if (!$scripts_puestos{$script}) {
        $scripts_puestos{$script} = @minuto_de_arranque;
        $minuto_de_arranque[@minuto_de_arranque] = $script;
    }
}

for my $minuto (1 .. $#minuto_de_arranque) {
    next if !$minuto_de_arranque[$minuto];
    print join " ", $minuto, 12, 30, ('*')x3, "diario/$minuto_de_arranque[$minuto]";
    print "\n";
}

__END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2008-08-22 04:08 @214, editado 1 vez en total
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 explorer » 2008-08-21 17:09 @756

Esta es la solución más aconsejable, aunque está llena de trucos, dado el formato del que partes.

Pero sí es lo recomendable, usar Config::Crontab, para este tipo de cosas.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use Config::Crontab;

use strict;
use warnings;
use diagnostics;

my $directorio = 'diario';
my $cron       = Config::Crontab->new();

my %scripts_puestos;
my $minuto_mayor = 0;

$cron->read( -file => "$directorio/planificacion.txt",  );

for my $evento ($cron->select()) {
    my $minuto = $evento->minute();
    $scripts_puestos{$evento->command()} = 1;
    $minuto_mayor = $minuto if $minuto > $minuto_mayor;
}

for my $script (<$directorio/S*>) {
    if (!$scripts_puestos{"* $script"}) {
        my $nuevo_evento
            = Config::Crontab::Event->new(
                -data => join(" ", ++$minuto_mayor, 12, 30, ('*')x2, "* $script"),
            );
        my ($block) = $cron->blocks();
        $block->last($nuevo_evento);
    }
}

$cron->write();

__END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Te aconsejo la lectura del módulo. Aunque es un poco largo, te simplifica mucho el manejo de ese tipo de ficheros.
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 1 invitado