#!/usr/bin/perl -l use warnings; use strict; # [id://11121105] # as suggested, have file() return an object which overloads > and >>, so you can overwrite and append # "value" > file('to_overwrite'); "value" >> file('to_append'); # or have fstream() return an object which overloads just <<, for a very c+_+-eseque # fstream("path") << 120 << " in hexadecimal is " << ctrl::hex << 120; END { print "="x10 }; { package fout; use autodie; use overload '>' => \&overwrite, '""' => sub { \${$_[0]} }, ; sub file($) { print __PACKAGE__, "::file($_[0])"; return bless \$_[0], __PACKAGE__; } sub overwrite { # 'value' > file($f) ==> overwrite(\$f, 'value', 1) my ($self, $value, $swap) = @_; if($swap) { open my $fh, '>', $$self; print {$fh} $value; } else { warn "not sure how to clobber scalar: `file($$self) > $value`"; } return $self; } } *file = \&fout::file; #no warnings 'void'; #file('zzz') > "value"; #fout::overwrite(file('xxx'), 'manual', 1); # this wrote the file correctly #'blah > file(yyy)' > file('yyy'); # will this? #print __PACKAGE__, "::"; { package fstream; use autodie; use overload '<<' => \&append, ; sub fstream($) { print __PACKAGE__, "::fstream($_[0])"; return bless \$_[0], __PACKAGE__; } sub fclobber($) { print __PACKAGE__, "::clobber($_[0])"; open my $fh, '>', $_[0]; return bless \$_[0], __PACKAGE__; } sub append { my ($self, $value, $swap) = @_; if(!$swap) { open my $fh, '>>', $$self; print {$fh} $value; } else { warn "not sure how to clobber scalar: `$value << file($$self)`"; } return $self; } } *fstream = \&fstream::fstream; *fclobber = \&fstream::fclobber; 'value' << fstream('szsz'); fstream('sss') << "first"; fstream('sss') << "second" << "third"; fclobber('clb') << 'one' << 'and another';