sub is_suffix { substr($_[0], -length($_[1])) eq $_[1] } sub common_suffix { $_[0] =~ m[(?>(.+))(?(?{ not is_suffix($_[1], $^N) })(?!))]s; return $1; } #### use List::Util qw/ reduce /; print reduce { common_suffix($a, $b) } qw/ redball greenball stall /; __END__ all #### sub common_suffix { $_[0] =~ m[ (?> (.+) ) (?(?{ not is_suffix($_[1], $^N) }) (?!) ) ]xs; return $1; }