Página 1 de 1

Open() + exec()

NotaPublicado: 2009-09-20 17:39 @777
por sepp0
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!

Re: Open() + exec()

NotaPublicado: 2009-09-20 18:01 @792
por creating021
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 :)

Re: Open() + exec()

NotaPublicado: 2009-09-20 18:30 @812
por sepp0
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?

Re: Open() + exec()

NotaPublicado: 2009-09-20 19:04 @836
por creating021
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.

Re: Open() + exec()

NotaPublicado: 2009-09-20 19:37 @859
por sepp0
Muchas gracias creating021, ¡voy a darle una mirada!

Re: Open() + exec()

NotaPublicado: 2009-09-20 20:19 @888
por explorer
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.