#! perl -sw package IO::Delayed; sub new { my $class = shift; ## Create an anonymous glob my $self = do{ local *GLOB; \*GLOB }; ## Use it to hold both the both the filehandle ## and a ramfile open *$self, '>', \${ *$self } or die $!; ## bless and return it return bless $self, $class; } sub setPath { my( $self, $path ) = @_; ## Re-use the glob for the real file open $self, '>', $path or die $!; ## Output the buffered data print $self ${ *$self }; ## Free up the storage undef ${ *$self }; return; } return 1 if caller; package main; my $log = IO::Delayed->new; ## create a rambuffered filehandle print $log "$_\n" for 1 .. 10; ## log some stuff to it $log->setPath( 'mylog.out' ); ## Now redirect it to disk print $log "$_\n" for 100 .. 110; ## and it becomes a normal filehandle __END__ C:\test>junk4 C:\test>type mylog.out 1 2 3 4 5 6 7 8 9 10 100 101 102 103 104 105 106 107 108 109 110