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.
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. –
@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
@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. –