Verwenden Sie einfach ähnliches Beispiel bash:
$variable=`some_command some args`;
das ist alles. Beachten Sie, dass bei der Ausgabe keine Ausdrucke auf STDOUT angezeigt werden, da dies zu Variable umgeleitet wird. Dieses Beispiel ist für Befehle, die mit Benutzern interagieren, unbrauchbar, außer Sie haben Antworten vorbereitet.
$variable=`cat answers.txt|some_command some args`;
innerhalb answers.txt Datei sollten Sie alle Antworten vorbereiten some_command funktioniert denn, dass Sie so etwas wie dieses mit Stapel von Shell-Befehlen verwenden können.
Ich weiß, das ist nicht der beste Weg für die Programmierung :), aber das ist der einfachste Weg, um das Ziel zu erreichen, speziell für Bash-Programmierer.
Natürlich, wenn die Ausgabe größer ist (ls mit Unterverzeichnis), sollten Sie nicht alle Ausgabe auf einmal erhalten. Lesebefehl von der gleichen Art und Weise, wie Sie regullar Datei lesen:
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;
Zusätzliche erweiterte Lösung für die Verarbeitung von langer Befehlsausgabe ohne zusätzliche bash calling:
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
}
Wenn Sie Prozedur wie das verwenden, erfassen Sie alle Prozedurausgabe, und Sie können die gesamte Verarbeitung Zeile für Zeile durchführen. Viel Glück :)
Verwenden Sie kein System, verwenden Sie offene() mit einem Rohr. –
Können Sie mir ein Beispiel geben? Vielen Dank! – Dagang
'perldoc -f open' –