Excellent! Since the worms are well out of the can (and pretty fast too!), can I add s|z, (f|ph) and add a plural case (rather than just making a singular)?
...
# $string =~ /^(.+)es$/ && push @patterns, $1; # singular
# Bliako modified:
($string =~ /^(.+?)(e?s)$/ && push @patterns, $1) # singular
|| push @patterns, $string.'(e?s)?'
;
s/(?<![sz])(?:s|z)(?=[^\)\.])/(?:s|z)/ for(@patterns);
s/f|ph/(:?f|ph)/ for(@patterns);
#print "patterns:"; print " /$_/" for(@patterns); print "\n";
# end mods
...