Das ist schon nicht ganz so einfach....
Die drunterliegende Infrastruktur (C-Bibliotheken) gibt's nicht her, mit einem 
print in zwei Dateien zu schreiben.  Eine 
Umleitung der Ausgabe passiert ja auch nicht im Programm selbst, sondern in der Shell, die das Programm aufruft.  "Irgendwer" muss also die zwei 
print-Aufrufe an die zwei Filehandles explizit nacheinander absetzen.
Wenn Du sowohl 
warn als auch direktes 
print STDERR abfangen willst, dann hilft Dir 
%SIG{__WARN__} auch nicht weiter.
Beim Apache kann man die Log-Inhalte auch an einen Prozess schicken, der Prozess könnte dann die zwei Dateien befüllen.  Das ist die normale Methode, um 
logrotate mit Apache zu verwenden - aber das ist dann doch wieder eine Pipe.
Wenn alles innerhalb eines Prozesses passierem soll, dann hätte ich zwei Ideem;
-   Capture::Tiny hat eine Methode tee_stderr.  Damit bekommst Du alles, was nach STDERR geht, zusätzlich in eine Variable, musst die aber immer noch zu einem geeigneten Zeitpunkt in Deine Logdatei schreiben.  Das mit dem "geeigneten Zeitpunkt" kann bei einem persistenten Perl-Interpreter etwas schwierig werden. Capture::Tiny hat eine Methode tee_stderr.  Damit bekommst Du alles, was nach STDERR geht, zusätzlich in eine Variable, musst die aber immer noch zu einem geeigneten Zeitpunkt in Deine Logdatei schreiben.  Das mit dem "geeigneten Zeitpunkt" kann bei einem persistenten Perl-Interpreter etwas schwierig werden.
-  Mit  perltie kannst Du den Handle STDERR in eine Klasse "umlenken", dazu gibt es einen eigenen Abschnitt in der Beschreibung.  Da schreibst Du dann eine PRINT-Methode etwa in der Art: perltie kannst Du den Handle STDERR in eine Klasse "umlenken", dazu gibt es einen eigenen Abschnitt in der Beschreibung.  Da schreibst Du dann eine PRINT-Methode etwa in der Art:
 
sub PRINT {
    my $self = shift;
    local STDERR; untie STDERR;
    print STDERR @_;
    print $my_log_file @_;
}