I think your solution is fine. If you want to get fancy, you could use my Tie::Handle::Argv, which is the basis of my File::Replace::Inplace, an emulation of the -i switch (note: Perl v5.16 strongly recommended):
use warnings; use 5.016; package Tie::Handle::FancyThingy { use parent 'Tie::Handle::Argv'; use File::Basename qw/fileparse/; sub OPEN { my ($self, $origfn) = @_; my ($fn, $dirs, $ext) = fileparse($origfn, qr/\.[^\.]+$/); my $outfn = $dirs.$fn.'.out'; print STDERR "Debug: $origfn => $outfn\n"; open ARGVOUT, '>', $outfn or die "$outfn: $!"; select ARGVOUT; return $self->SUPER::OPEN($origfn); } sub inner_close { my $self = shift; select STDOUT; return $self->SUPER::inner_close(@_); } } tie *ARGV, 'Tie::Handle::FancyThingy'; while (<>) { chomp; say translate($_); } sub translate { return "<".shift.">" }
A more simplistic approach might be to just use the -i switch to write the "backup" (input) files to a different directory and then rename the output afterwards.
Minor edit to code: Replaced my $ofh (output filehandle) with the more appropriate ARGVOUT.
In reply to Re: One to one file output idiom
by haukex
in thread One to one file output idiom
by Eily
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |