#! perl use strict; use warnings; use List::Util qw(any); my $file = do { local $/; ; }; # Slurp the whole file into a string # Make a hash that maps each word to its word count in the file my %words; ++$words{lc $_} for split /\W+/, $file; # Construct a regular expression to match each word which appears at least twice my $re; if (any { $_ > 1 } values %words) { my $str = '\\b' . join('\\b|\\b', grep { $words{$_} > 1 } keys %words) . '\\b'; $re = qr{($str)}i; } $words{$_} = 0 for keys %words; # Re-set the word counts to zero # Mark the second and subsequent occurrences of each word $file =~ s{$re}{ $words{lc $1}++ ? "*$1*" : $1 }eg if $re; print $file;