use strict; use warnings; use feature 'say'; use autodie qw( :all ); open my $log, '>', 'output.txt'; tie *BOTH, 'Multiplex', *STDOUT, $log; select *BOTH; say 'Sent to display and log : ', 'tested'; printf "%s should get %s\n", qw( Both this ); select *STDOUT; say 'Sent to display only'; select $log; say 'Sent to log only'; package Multiplex; use parent 'Tie::Handle'; sub TIEHANDLE { my $class = shift; bless [ @_ ], $class } sub PRINT { my ($self,@vals) = @_; print $_ @vals for @$self } sub PRINTF { my ($self,@vals) = @_; printf $_ @vals for @$self }