Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Duda if

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Mie Ago 20, 2008 8:19 am
ElCidJJ
Perlero Nuevo
Perlero Nuevo
Registrado: 19 Ago 2008
Mensajes: 8
Duda if Responder citando

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:

Perl:
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");
    }
}


Espero que esté claro y que me podáis ayudar. Un saludo de nuevo y muchísimas gracias por todo.
Mensaje Mie Ago 20, 2008 11:05 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4087
Ubicación: Valladolid, España
Responder citando

Se parece mucho a esto...

http://perlenespanol.baboonsoftware.com/foro/viewtopic.php?t=2307&highlight=comparar+ficheros
Mensaje Jue Ago 21, 2008 5:49 am
ElCidJJ
Perlero Nuevo
Perlero Nuevo
Registrado: 19 Ago 2008
Mensajes: 8
Responder citando

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 Sad

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.
Mensaje Jue Ago 21, 2008 6:35 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4087
Ubicación: Valladolid, España
Responder citando

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?
Mensaje Jue Ago 21, 2008 8:17 am
ElCidJJ
Perlero Nuevo
Perlero Nuevo
Registrado: 19 Ago 2008
Mensajes: 8
Responder citando

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:
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.
Mensaje Jue Ago 21, 2008 1:18 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4087
Ubicación: Valladolid, España
Responder citando

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

Perl:
#!/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__


Ultima edición por explorer el Vie Ago 22, 2008 3:08 am, editado 1 vez
Mensaje Jue Ago 21, 2008 4:09 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4087
Ubicación: Valladolid, España
Responder citando

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.

Perl:
#!/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__
Te aconsejo la lectura del módulo. Aunque es un poco largo, te simplifica mucho el manejo de ese tipo de ficheros.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group