tie *STDOUT, 'InstallerHandleTie', $outfile, *STDOUT;
tie *STDERR, 'InstallerHandleTie', $outfile, *STDERR;
####
package InstallerHandleTie;
use strict;
no strict 'refs';
use FileHandle;
use Tie::Handle;
our @ISA = qw (Tie::StdHandle);
use File::Basename;
use File::Path;
my $handleId = 0; # this is a class variable so multiple ties
# to same file will create different handles
sub TIEHANDLE {
my $class = shift;
my @handles = ();
# see if each handle is a filename or a real handle
foreach my $h (@_) {
if ($h =~ /^\*/ or ref $h eq 'GLOB') {
# it's a handle (ie *package::name) or a glob
push @handles, $h;
$h->autoflush(1);
} else {
# assume it is a file name and try to open
# create a handle name based on
my $hname = "_FH_$handleId";
$handleId++;
my $dir = dirname($h);
if (!-e $dir or !-d $h) {
mkpath($dir);
}
open($hname, ">$h") or die "unable to open file '$h': $!";
$hname->autoflush(1);
push @handles, $hname;
}
}
return bless \@handles, $class;
}
sub PRINT {
my $self = shift;
my $result = 0;
foreach my $handle (@$self) {
$result += print $handle @_ if (fileno($handle));
}
return ($result == @$self);
}
sub PRINTF {
my $self = shift;
my $result = 0;
foreach my $handle (@$self) {
$result += printf $handle @_ if (fileno($handle));
}
return ($result == @$self);
}
1; # required 1 to end the Perl module
####
my $gfh = *STDOUT;
my $geh = *STDERR;
foreach my $outfile (@logs) {
local *STDOUT;
local *STDERR;
tie *STDOUT, 'InstallerHandleTie', $outfile, $gfh;
tie *STDERR, 'InstallerHandleTie', $outfile, $geh;
print "Writing to $outfile\n";
warn "Writing warning to $outfile\n";
untie *STDOUT;
untie *STDERR;
}