my %translations; my %scrubbed; while ($file =~ /^ \s+ description \s (\w\w\w\w(-\w+-\w+)) ;/xmg) { my $real_dev = $1; my $name = $2; if (!$translation{$real_dev}) { # Make sure not to duplicate anything in %scrubbed. my $scrubbed_dev = ...; ++$scrubbed{$scrubbed_dev}; $translation{$real_dev} = $scrubbed_dev; } } my $pat = join '|', map quotemeta, keys %translations; my $re = qr/$pat/; $file =~ s/($re)/$translations{$1}/g;