use Fcntl qw(:seek); open (FOO, "+<$foo") or die "Can't open $foo: $!"; my $slurp = join '', ; $slurp =~ s/hello/goodbye/sgi; seek FOO, 0, SEEK_SET; print FOO $slurp; truncate FOO, tell FOO; close FOO;