Hmm, interessant, wie verschiedene Leute diese verschiedenen Möglichkeiten beantworten. Es sieht für mich so aus wie mk und Daniel Fone interpretiert es als wollen/manipulieren die stdout des Befehls (keine ihrer Lösungen erfassen stderr fwiw). Ich denke, Rudd ist näher gekommen. Eine Wendung, die Sie bei Rudds Antwort machen könnten, besteht darin, den integrierten Befehl system() mit Ihrer eigenen Version zu überschreiben, so dass Sie den vorhandenen Code nicht neu schreiben müssen, um seinen Befehl execute() zu verwenden.
if ($DEBUG) {
*{"CORE::GLOBAL::system"} = \&{"main::execute"};
}
denke ich, das wird funktionieren, aber ich muss zugeben, dass diese Voodoo ist und es war:
mit seinem execute() Unter von Rudds Post, Sie so etwas wie dies an der Spitze des Codes haben könnte eine Weile, seit ich diesen Code geschrieben habe. Hier ist der Code, den ich Jahre schrieb vor Systemaufrufen auf einem lokal (Aufruf Namespace) oder globale Ebene auf Modulladezeit abfangen:
# importing into either the calling or global namespace _must_ be
# done from import(). Doing it elsewhere will not have desired results.
delete($opts{handle_system});
if ($do_system) {
if ($do_system eq 'local') {
*{"$callpkg\::system"} = \&{"$_package\::system"};
} else {
*{"CORE::GLOBAL::system"} = \&{"$_package\::system"};
}
}
Das große Problem mit dem globalen 'system' Befehl zu ersetzen ist, dass' system' einen komplexen Prototyp hat, die nicht von repliziert werden kann das benutzerspezifische Prototypsystem. Daher funktioniert ein Code einfach nicht, wenn Sie 'system' durch Ihre benutzerdefinierte Version ersetzen. – cjm