• Publicidad

Sustituir extension fichero por otra

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

Sustituir extension fichero por otra

Notapor soasada » 2015-09-01 15:14 @676

Hola a todos. Antes que nada, me presento: soy soasada y soy nuevo por estos lares, je,je.

Tengo experiencia con otros lenguajes de programación, como Java, C/C++ y PL/SQL.

Hace poco me he metido con Perl para aprenderlo como lenguaje "navaja suiza" para tareas repetitivas y pequeñas chapuzas de administración. El "quick-and-dirty" que Perl nos ofrece me viene de perlas.

El caso es que estoy haciendo un script que ejecuta otros scripts y compara resultados para saber si las salidas son correctas o no.

La primera pregunta es: ¿es posible guardar la salida de la función system()? Necesito guardarla para después comparar.

La segunda pregunta es la que me ha hecho abrir este tema: estoy recorriendo un directorio lleno de ficheros acabados en .plx. Mi iterador $plxcFile contiene la ruta de cada uno de los ficheros acabados en ".plx" y tengo otra variable la cual utilizo para guardar el mismo nombre que contiene $plxcFile pero acabado en ".ctd".

Sin más pongo el código de prueba que estoy realizando:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use warnings;
  5. use diagnostics;
  6. use autodie;
  7.  
  8. my $plxcFile;
  9. my $ctdFile;
  10.  
  11. my @files = </home/user/folder/folder2-2015/*>;
  12. foreach $plxcFile (@files){
  13.         if($plxcFile =~ /\.plx$/i){
  14.                 $ctdFile = ($plxcFile =~ s/\.plx/\.ctd/);
  15.                 print $ctdFile . "\n";
  16.         }
  17. }
  18.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Lo que me imprime esto es una lista de '1' que realmente no quiero. ¿Cómo puedo hacer para que en la variable $ctdFile guarde el mismo nombre pero acabado en ./ctd?

¿Esto es factible?
Sintáxis: [ Descargar ] [ Ocultar ]
  1. my @args = ("comando", "arg1", "arg2"); 
  2. my $salida = system(@args) == 0 or die "system @args failed: $?"; 

Asé podré comparar la salida con otra variable que también hace uso de system().

Gracias y un saludo.
Avatar de Usuario
soasada
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2015-09-01 11:33 @523
Ubicación: Málaga - España

Publicidad

Re: Sustituir extension fichero por otra

Notapor explorer » 2015-09-02 02:54 @162

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

Y bienvenido a la comunidad Perl.

Te darás cuenta que Perl te sirve para lo que quieres, incluso para mucho más, como por ejemplo usarlo para todo el proceso.

En cuanto a la primera pregunta: para guardar el resultado de la ejecución de un programa debes usar el operador qx():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $salida = qx(programa.exe argumento1 argumento2);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Para la segunda pregunta y mirando tu código, el cambio que tienes que hacer es muy simple:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.                 ($ctdFile = $plxcFile) =~ s/\.plx/\.ctd/);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La razón es simple: primero copiamos el valor de $plxcFile a $ctdFile, y luego aplicamos la sustitución a esta segunda variable.

Una vez que tengas los dos nombres, te vale con usar el método move() del módulo File::Copy y podrás cambiarle de nombre.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Sustituir extension fichero por otra

Notapor soasada » 2015-09-02 06:20 @305

explorer escribiste:Bienvenido a los foros de Perl en Español, soasada.

Y bienvenido a la comunidad Perl.

Te darás cuenta que Perl te sirve para lo que quieres, incluso para mucho más, como por ejemplo usarlo para todo el proceso.

En cuanto a la primera pregunta: para guardar el resultado de la ejecución de un programa debes usar el operador qx():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $salida = qx(programa.exe argumento1 argumento2);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Para la segunda pregunta y mirando tu código, el cambio que tienes que hacer es muy simple:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.                 ($ctdFile = $plxcFile) =~ s/\.plx/\.ctd/);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La razón es simple: primero copiamos el valor de $plxcFile a $ctdFile, y luego aplicamos la sustitución a esta segunda variable.

Una vez que tengas los dos nombres, te vale con usar el método move() del módulo File::Copy y podrás cambiarle de nombre.


Muchas gracias, explorer. Me ha servido todo, pero tengo una pequeña duda.

Cuando ejecuto los script externos a través de Perl con qx() quiero que no se me muestre por pantalla nada. Es decir, quiero ir contando los casos que tienen éxito y los que no. Pero al usar el operador qx() me muestra mensajes por pantalla. ¿Es posible que sea por el uso de warnings, diagnostics y autodie?

Aquí te dejo la segunda versión del script:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use warnings;
  5. use diagnostics;
  6. use autodie;
  7.  
  8. my $plxcFile;
  9. my $ctdFile;
  10.  
  11. my $cont = 0;
  12. my $cont2 = 0;
  13.  
  14. my @files = </home/usuario/folder/folder2/*>;
  15. foreach $plxcFile (@files){
  16.         if($plxcFile =~ /\.plx$/i){
  17.                 $ctdFile = $plxcFile;
  18.                 $ctdFile =~ s/\.plx/\.ctd/;
  19.  
  20.                 my $compila = qx(./plxc $plxcFile $ctdFile);
  21.                 my $salida1 = `./ctd $ctdFile`;
  22.  
  23.                 my $compila2 = qx(java PLXC $plxcFile $ctdFile);
  24.                 my $salida2 = `./ctd $ctdFile`;
  25.  
  26.                 if($salida1 == $salida2){
  27.                         $cont++;
  28.                 }
  29.  
  30.                 $cont2++;
  31.  
  32.         }
  33. }
  34.  
  35. if($cont == $cont2){
  36.         print "Éxito!\n";
  37. }
  38. else{
  39.         print "Has tenido algún error, número de test pasados: " . $cont . "\n";
  40. }
  41.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


EDITO: Me explico mejor. Algunas de las pruebas que estoy lanzando dan resultados erróneos. Es decir, los scripts no se ejecutan correctamente y muestran un mensaje de error. Creo que por esta razón qx() me está mostrando estos mensajes de error por pantalla en vez de guardarlos en las variables.
Avatar de Usuario
soasada
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2015-09-01 11:33 @523
Ubicación: Málaga - España

Re: Sustituir extension fichero por otra

Notapor explorer » 2015-09-02 18:10 @798

Cuando un programa arranca, el sistema operativo le abre una serie de canales de entrada y salida:
  • entrada estándar
  • salida estándar
  • salida estándar de errores
El programa es libre de usarlos o no (puede decidir escribir la salida a un archivo, por ejemplo, pero el tener canales ya abiertos permite que el programa no tenga que abrirlos por sí mismo (con lo que el programa queda más corto) y lo más probable es que un programa lea/escriba cosas desde/hacia los periféricos del usuario (teclado/pantalla).

Sabemos lo que significa entrada y salida estándar. Pero, ¿y la salida estándar de error? Bueno, pues se trata del canal abierto por el cual el programa sacaría los mensajes de error.

Normalmente, ese canal es el mismo que el de salida estándar (la pantalla), porque suponemos que el usuario solo está mirando a un sitio (otra vez, la pantalla). El resultado es que, en caso de errores, vemos por la pantalla los mensajes mezclados de la salida normal del programa, junto con los mensajes de error.

El propio programa debería ser capaz, a petición del usuario, de derivar los mensajes de error, a otro sitio (quizás, un archivo). Eso se suele hacer desde el shell, con las redirecciones shell ('>', '<', '|', '>>').

Cuando usas qx(), estás capturando todos esos mensajes (salida estándar y salida estándar de error).

Si solo quieres capturar la salida estándar, debes usar las backticks:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     $salida = `programa.exe argumento1 argumento2`;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Más información, en tu ordenador, con el comando perldoc -q stderr

P.D.: es mejor que un programa no genere mensajes de error. Si lo hace, será por una poderosa razón.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
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: Google [Bot] y 5 invitados