my $n = 3; my $newword = NEW; my $n_minus_one = $n-1; while () { s/((?:\w+\s+){$n_minus_one})(\w+)/$1$newword/; print; } __DATA__ hi there everyone I am looking to substitute lots of words for new ones, but only the third word per line on each line! one one two one two three one two three four __OUTPUT__ hi there NEW I am looking to substitute lots of NEW for new ones, but only the third word per NEW on each line! one one two one two NEW one two NEW four #### s/((?:\w+\s+){$n_minus_one})(\w+)/$1$newword/; #### s/((?:[\w'\-]+[^\w'\-]+){$n_minus_one})(\w+)/$1$newword/;