Simplemente uso similar para golpear ejemplo:
$variable=`some_command some args`;
eso es todo. aviso, no verá en el resultado ninguna impresión en STDOUT porque esto se redirige a variable. Este ejemplo no se puede utilizar para el comando que interactúa con el usuario, excepto que tiene respuestas preparadas. para eso se puede usar algo como esto utilizando pila de comandos shell:
$variable=`cat answers.txt|some_command some args`;
dentro answers.txt archivo que debe prepararse para todas las respuestas some_command funciona correctamente.
Sé que esta no es la mejor manera de programar :) pero esta es la manera más simple de cómo lograr el objetivo, especialmente para los programadores de bash.
Por supuesto, si la salida es mayor (ls con subdirectorio), no debería obtener todos los resultados a la vez. Comando de lectura de la misma manera a medida que lee el archivo regullar:
open CMD,'-|','your_command some args' or die [email protected];
my $line;
while (defined($line=<CMD>)) {
print $line; #or push @table,$line or do whatewer what you want processing line by line
}
close CMD;
solución extendida adicional para el procesamiento de salida de comando de tiempo sin extra de fiesta llamada:
my @CommandCall=qw(find/-type d); #some example single command
my $commandSTDOUT; #file handler
my $pid=open($commandSTDOUT),'-|'); #there will be implict fork!
if ($pid) {
#parent side
my $singleLine;
while(defined($singleline=<$commandSTDOUT>)) {
chomp $line; #typically we don't need EOL
do_some_processing_with($line);
};
close $commandSTDOUT; #in this place $? will be set for capture
$exitcode=$? >> 8;
do_something_with_exit_code($exitcode);
} else {
#child side, there you really calls a command
open STDERR, '>>&', 'STDOUT'; #redirect stderr to stdout if needed, it works only for child, remember about fork
exec(@CommandCall); #at this point child code is overloaded by external command with parameters
die "Cannot call @CommandCall"; #error procedure if call will fail
}
Si utiliza el procedimiento de esa manera, se le capturar todo salida del procedimiento, y puede hacer todo el proceso línea por línea. Buena suerte :)
No utilice el sistema, use abrir() con un tubo. –
¿podría darme un ejemplo? ¡Gracias! – Dagang
'perldoc -f open' –