$re = '([a-z]\d)\s+(\d)\s+(\d)' . join '', '(?:\s+(\d\.\d))?' x 10;; $re = qr"$re";; $s = 'a1 1 2 1.0 1.1 1.2 1.3';; print grep defined, $s =~ $re;; a1 1 2 1.0 1.1 1.2 1.3 $s = 'a1 1 2 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7';; print grep defined, $s =~ $re;; a1 1 2 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7