Mie Ago 20, 2008 8:19 am
|
 |
ElCidJJ
Perlero Nuevo

|
Registrado: 19 Ago 2008
Mensajes: 8
|
|
| Duda if |
|
|
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. |
|
|
|

Mie Ago 20, 2008 11:05 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4087
Ubicación: Valladolid, España
|
|
|
|

Jue Ago 21, 2008 5:49 am
|
 |
ElCidJJ
Perlero Nuevo

|
Registrado: 19 Ago 2008
Mensajes: 8
|
|
|
|
|
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. |
|

Jue Ago 21, 2008 6:35 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4087
Ubicación: Valladolid, España
|
|
|
|
|
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? |
|

Jue Ago 21, 2008 8:17 am
|
 |
ElCidJJ
Perlero Nuevo

|
Registrado: 19 Ago 2008
Mensajes: 8
|
|
|
|
|
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. |
|

Jue Ago 21, 2008 1:18 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4087
Ubicación: Valladolid, España
|
|
|
|
|
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 |
|

Jue Ago 21, 2008 4:09 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4087
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|

Powered by phpBB © 2001, 2005 phpBB Group
|