• Publicidad

Error al usar system()

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

Error al usar system()

Notapor dgonzalez » 2012-11-20 10:11 @466

Hola, estimados. :D

Soy nuevo en el foro y recién comienzo a programar en Perl.

Les cuento tengo que hacer un programa que respalde archivos .pl dentro de un directorio en particular ingresado por el usuario al igual que el directorio donde quedarán los respaldos.

El problema mayor que tengo es que no me funciona la copia, para lo cual estoy utilizando el comando system("cp $_ $dir_destino);

He intentado con el módulo File::Copy, pero me da un error y no sé cómo resolverlo.

Adjunto archivo con el código, por favor ¡¡¡ayudaaaaaaaaaaa!!!


Gracias.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #file name: tarea2.pl
  3. use strict vars;
  4. #use File::Copy;
  5. my ($dir_origen, $dir_destino, @files, $resul,$copy);
  6.  
  7. print ("Ingrese directorio/ruta a respaldar:");
  8. $dir_origen=<STDIN>;
  9. chomp ($dir_origen);
  10. print ("Ingrese directorio/ruta de destino del respaldo:");
  11. $dir_destino=<STDIN>;
  12. chomp ($dir_destino);
  13.  
  14. if (lc($dir_origen) eq lc($dir_destino))
  15. {
  16.         print ("El dir. de origen de respaldo no puede ser igual dir. de destino\n");
  17.         exit;
  18. }
  19. if (-e $dir_destino)
  20. {
  21.         #system("find $dir_origen -name *.pl > /filesok.txt");
  22.         $resul=`find $dir_origen -name "*.pl" > filesok.txt`;
  23.         open(INFILE, "filesok.txt");
  24.         while (<INFILE>){
  25.                 #file::copy::copy ($_, $dir_destino\$copy_Date);
  26.                 system("cp $_  $dir_destino");
  27.         }
  28. }
  29. else
  30. {
  31.         print("Directorio no existe\n");
  32. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-11-20 10:24 @475, editado 1 vez en total
Razón: Marcas de código Perl
dgonzalez
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2012-11-19 22:05 @961

Publicidad

Re: Error al usar system()

Notapor explorer » 2012-11-20 10:34 @482

Bienvenido a los foros de Perl en Español, dgonzalez.

Creo que el problema está en la lectura de los archivos, en el while().

Al hacer la lectura con el operador diamante (<INFILE>) estás leyendo línea a línea desde el archivo filesok.txt. Cada línea es almacenada en $_, que luego se lo pasas a system(), pero...

Pero resulta que en esa línea, además del nombre del archivo, va acompañada del/de los caracteres finales de línea.

Por eso cp no encuentra nada: porque los nombres de los archivos que le estás pasando no son correctos (tienen un retorno de carro/avance de línea, al final).

La solución es insertar un chomp; justo después de la lectura, antes de la línea 25:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.                 chomp;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
De esta manera, los caracteres finales de línea son descartados de $_.

Una cosa más: todas las operaciones de búsqueda y copia las puedes realizar en Perl, con los módulos File::Find y File::Copy, como verás en muchos de los hilos de estos foros.

La otra alternativa es no usar Perl:

find dir_origen -name "*.pl" -exec cp {} dir_destino \;

pero seguro que al profesor de Perl no le gustará...

Truco: en Perl existe un script llamado find2perl.
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

Re: Error al usar system()

Notapor dgonzalez » 2012-11-20 11:05 @504

¡¡¡Muchas gracias, explorer!!! te pasaste.
Funcionó a la primera...
dgonzalez
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2012-11-19 22:05 @961


Volver a Básico

¿Quién está conectado?

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