Inplace-Edit

えー、null filehandle を使うときは素直に inplace-edit を使えばいいんじゃないでしょうか。

$^I = ""; # or $INPLACE_EDIT = "";
while (<>) {
    s/foo/bar/;
    print;
}

ここでは$^Iを空文字にしてるけど、適当な文字列を入れれば、バックアップファイルの suffix として使われる。
null filehandle を使えない場合は、File::Inplace を使うとか。使ったことないけど。

use File::Inplace;

my $editor = File::Inplace->new(file => 'foo.txt')
while (my ($line) = $editor->next_line) {
    $line =~ s/foo/bar/;
    $editor->replace_line($line);
}
$editor->commit;

まぁ、この例ぐらいだとワンライナーの方が速いというオチもあるけど。

% perl -pi -e 's/foo/bar/' foo.txt