El Módulo IPC::Run3

Hay un buen número de módulos Perl que permiten controlar la redirección no sólo de stdin y stdout sino también de stderr y que constituyen una alternativa a system y qx. Entre estos se encuentra IPC::Run3. El módulo no forma parte del núcleo de Perl y hay que descargarlo desde CPAN:

pp2@nereida:~/src/perl/pipesconnombre$ perl -MIPC::Run3 -wde 0 
main::(pi_pipenamed_cas.pl:15): my ($nprocs, $nblocks);
  DB<1> run3(['ls', '-l']) # usa STDIN, STDOUT, STDERR
total 36
-rwx------  1 pp2 pp2 14058 2006-03-27 23:33 pi
-rw-------  1 pp2 pp2   488 2006-03-27 23:33 pi.c
-rwx------  1 pp2 pp2  1902 2006-03-28 18:25 pi_pipe_con_nombre.pl
-rwxr-x---  1 pp2 pp2  6677 2007-03-10 09:19 pi_pipe_con_nombre.tar.gz
-rwx------  1 pp2 pp2  2589 2007-03-12 09:21 pi_pipenamed_cas.pl
  DB<2> open $err, '> errores.txt'  # errores a $err
  DB<3> run3(['ls', '-l', 'chuchu'], undef, undef, $err) 
  DB<4> !!cat errores.txt # Mostremos los contenidos del fichero 
ls: chuchu: No existe el fichero o el directorio
  DB<5> run3(['ls', '-l'], undef, \undef) # STDOUT a /dev/null
  DB<6>              
  DB<6> run3(['ls', '-l', 'chuchu'], undef, undef, undef)
ls: chuchu: No existe el fichero o el directorio
  DB<7> sub out { print "\n".scalar(@_)." args\n<<<<<<<<<<<<<<<<<\n@_\n>>>>>>>>>>>>>>>>>" }
  DB<8> run3(['ls', '-l', qw{bidirwithnamedpipes.pl errores.txt}], undef, \&out)

1 args
<<<<<<<<<<<<<<<<<
-rwxr-xr-x 1 pp2 pp2 1038 2009-03-11 17:31 bidirwithnamedpipes.pl

>>>>>>>>>>>>>>>>>
1 args
<<<<<<<<<<<<<<<<<
-rw-r--r-- 1 pp2 pp2   69 2010-03-01 08:16 errores.txt

>>>>>>>>>>>>>>>>>

run3 retorna TRUE si el comando pudo ejecutarse. En caso contrario provoca la muerte del programa. Deja $? con la información intacta para su consulta.

Casiano Rodríguez León
2012-02-29