use warnings; use strict; use 5.006; { package Tie::Handle::CloseAppend; sub TIEHANDLE { my($class, $string, $handle) = @_; my %obj; $obj{"handle"} = $handle; # this argument to tie is optional $obj{"string"} = $string; $obj{"open"} = defined($handle); bless \%obj, $class; } sub OPEN { my($obj, $arg, @arg) = @_; $$obj{"open"} = 1; open $$obj{"handle"}, $arg, @arg; } sub _preclose { my($obj) = @_; printf { $$obj{"handle"} } "%s", $$obj{"string"} or warn "warning: could not print closing string to Tie::Handle::CloseAppend handle: $!"; } sub CLOSE { my($obj) = @_; _preclose($obj); $$obj{"open"} = 0; close $$obj{"handle"}; } sub DESTROY { my($obj) = @_; if ($$obj{"open"}) { _preclose($obj); } }