У меня нет окна для проверки этого, но, возможно, вы могли бы сделать что-то вроде создания привязанного дескриптора, который будет печатать как в STDOUT, так и в журнал, а затем перенаправить STDOUT и STDERR на него?
РЕДАКТИРОВАТЬ: Единственный страх, который у меня есть, это метод хранения STDOUT для последующего использования, я добавил вторую возможность для хранения STDOUT для последующего использования, если первый не работает в Windows. Они оба работают на меня в Linux.
#!/usr/bin/perl
use strict;
use warnings;
tie *NEWOUT, 'MyHandle', 'test.log';
*STDOUT = *NEWOUT;
*STDERR = *NEWOUT;
print "Print\n";
warn "Warn\n";
package MyHandle;
sub TIEHANDLE {
my $class = shift;
my $filename = shift;
open my $fh, '>', $filename or die "Could not open file $filename";
## Use one of these next two lines to store STDOUT for later use.
## Both work for me on Linux, if one does not work on Windows try the other.
open(OLDSTDOUT, '>&STDOUT') or die "Could not store STDOUT";
#*OLDSTDOUT = *STDOUT;
my $self = {
loghandle => $fh,
logfilename => $filename,
stdout => \*OLDSTDOUT,
};
bless $self, $class;
return $self;
}
sub PRINT {
my $self = shift;
my $log = $self->{loghandle};
my $stdout = $self->{stdout};
print $log @_;
print $stdout @_;
}