2012-06-14 4 views
5

Parece que las variables en los palos de retroceso no se expanden cuando pasan a la función readpipe. Si anulo la función readpipe, ¿cómo puedo expandir las variables?¿Cómo puedo expandir las variables en los controladores de lectura de Perl?

BEGIN { 
*CORE::GLOBAL::readpipe = sub {print "Run:@_\n"}; 
} 

`ls /root`; 
my $dir = "/var"; 
`ls $dir`; 

La ejecución de este da:

Run:ls /root 
Run:ls $dir 

Estoy tratando de burlarse de las llamadas externas de un código de prueba que estoy escribiendo. Si hay un módulo de CPAN en alguna parte que pueda ayudar a cuidar todo esto, eso también ayudaría.

actualización:

he decidido utilizar una solución muy feo a mi problema. Resulta que usar readpipe() en lugar de barras invertidas amplía las variables correctamente. Estoy usando un limpiador automático de scripts antes de ejecutar mis pruebas, que convierte todos los backticks en readpipe() antes de ejecutar las pruebas.

por ejemplo de reproducción:

$ cat t.pl 

BEGIN { 
    *CORE::GLOBAL::readpipe = sub {print "Run:@_\n"}; 
} 

`ls /root`; 
my $dir = "/var"; 
`ls $dir`; 
readpipe("ls $dir"); 

Da:

$ perl t.pl 
Run:ls /root 
Run:ls $dir 
Run:ls /var 

sigo mirando hacia fuera para una solución más limpia aunque.

Respuesta

3

Eso parece ser un error en Perl. Use perlbug para reportarlo.

1

Probablemente desee utilizar IPC::Run en su lugar.

use IPC::Run 'run'; 

run [ "ls", $dir ], ">", \my $stdout or die "Cannot run - $!"; 

O si no desea capturar la salida, system() puede haber mejores

system("ls", $dir) == 0 or die "Cannot system - $!"; 
+1

Gracias a que el árbitro módulo. Sin embargo, estoy buscando una manera fácil de burlar llamadas al sistema como backticks y system() para ejecutar mis pruebas de unidad de un código heredado. –

+0

@SandipBhattacharya estoy seguro de que no entiendo el problema. Los backticks y el ejecutor no devuelven ningún resultado mientras el sistema lo hace. evaluaría y qx encajaría en la cuenta? – shinronin

+0

@shinronin Estoy intentando anular/simular backticks en el código heredado existente para que pueda probarlos de forma segura. Si bien puedo reemplazar el '* CORE :: GLOBAL :: readpipe' para simular backticks, no funcionan en los casos en que el argumento incluye variables para expandir. Debido a este comportamiento incoherente entre los palos de atrás y 'readpipe()' es difícil burlarse de dicho código. No estoy intentando escribir un nuevo código. Si lo hiciera, habría usado 'readpipe()' en lugar de backticks para poder simular el código si lo deseo. –

Cuestiones relacionadas