$float='\d+(?:\.\d+)?'; $int='\d+'; @pats=("r($int)", "rect($float)x($float)", "dounut_s($int)x($int)"); $pat=join("|", @pats); @numbers=grep { defined($_) } ($str =~ /^(?:$pat)$/);