use Tie::File; sub replace_serialnumbers_in_file($) { my @word = qw( zero one two three four five six seven eight nine ); my $filename = shift; my $serno = join '', map $word[$_], $filename =~ /(\d)/; # assuming no other digits in the filename tie my @lines, 'Tie::File', $filename or die; s/\\zerozerozero/\\$serno/g for @lines; }