• Publicidad

Open() + exec()

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Open() + exec()

Notapor sepp0 » 2009-09-20 17:39 @777

Hola a todos, estoy aprendiendo hace muy poco Perl y estoy haciendo un script; básicamente lo que no logro hacer es que al abrir un archivo y detectar unas líneas, las mismas las pase como variables para poder ser ejecutadas con un exec(). Les dejo la parte del código que no funciona:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open(FD,$patch);

my $found = 0;
my $linea;
my $linea2;

foreach(<FD>)
{
    if($_ =~ /Los comandos son:/) {
         $linea = <FD>;
         $linea2 = <FD>;
         $found = 1;
    }
}
close(FD);

if($found) {
   exec("$linea");
   exec("$linea2");
} else {
   print "No se encontraron los comandos\n";
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Básicamente luego de la línea 'Los comandos son:' hay 2 líneas debajo con comandos, que deberían terminar en el exec() pero no lo logro hacer. ¿Ideas?

¡Gracias!
Última edición por explorer el 2009-09-20 20:01 @875, editado 1 vez en total
Razón: Ortografía
sepp0
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2009-09-20 17:33 @773

Publicidad

Re: Open() + exec()

Notapor creating021 » 2009-09-20 18:01 @792

Hola y bienvenido al foro.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use diagnostics;
  4.  
  5. my $patch = "fichero";
  6. my $find = 0;
  7. my @exec;
  8. open FL, $patch or die "Error con $patch: $!\n";
  9. while ( my $linea = <FL> ) {
  10.     chomp $linea;
  11.     if ( $find == 0 and $linea ~= /^Los comandos son:$/ ) {
  12.         $find = 1;
  13.     }
  14.     elsif ( $find == 1 ) {
  15.         push @exec, $linea;
  16.     }
  17.     else { die "No encontre nada\n";}
  18. }
  19.  
  20. exec $_ for @exec;
  21.  
  22. close FL;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

En teoría funciona :)
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Re: Open() + exec()

Notapor sepp0 » 2009-09-20 18:30 @812

Gracias creating021,

El tema es que una de esas líneas es un: cd /path/a/algo y no puedo hacer un system() o exec() así que debería usar un chdir() pero la otra línea es un comando. ¿Cómo debería ser?
Última edición por explorer el 2009-09-20 20:02 @876, editado 1 vez en total
Razón: Ortografía
sepp0
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2009-09-20 17:33 @773

Re: Open() + exec()

Notapor creating021 » 2009-09-20 19:04 @836

sepp0 escribiste:Gracias creating021,

El tema es que una de esas lineas es un: cd /path/a/algo y no puedo hacer un system() o exec() asi que debería usar un chdir() pero la otra linea es un comando, como deberia ser?

Agregando un if y modificando el elsif existente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. elsif ( $find == 1 ) {
  2.     if ( $line =~ /^cd\s+(.*)$/ ) {
  3.         chdir $1 or die "chdir $1: $!\n";
  4.     }
  5.     else { push @exec, $linea; }
  6. }
  7.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Te recomiendo que mires los tutoriales del foro, te dirán todo lo que necesitas.
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Re: Open() + exec()

Notapor sepp0 » 2009-09-20 19:37 @859

Muchas gracias creating021, ¡voy a darle una mirada!
sepp0
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2009-09-20 17:33 @773

Re: Open() + exec()

Notapor explorer » 2009-09-20 20:19 @888

sepp0, en cuanto hagas el primer exec(), tu programa Perl será sustituido por el comando que estás llamando, y no podrás ejecutar el resto.

Es mucho mejor que agrupes los comandos a ejecutar en una sola cadena, unida con ';', y la ejecutes con un system() (en el caso de que luego quieras seguir con tu programa Perl) o un exec().

Algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
system( join ';', @exec );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


A mí me funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
explorer@casa:~> perl -le '@exec = ("cd Documents","ls -alrt"); system( join ";", @exec )'
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Eso sí, suponemos que estás en un shell Bash, ya que si estás en MSDOS... pues como que ahora no me acuerdo qué separador usaban (tampoco lo voy a buscar).

Saludos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

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

cron