This is a huge stab in the dark here, but I thought I'd give it a try. On the last line of the regex, it uses a code evaluation expression (which I believe is still experimental) to set the @cts array using the last unused portion of the line in an internal, separate regex.
#!/usr/bin/perl use warnings; use strict; my %bad; while (<DATA>){ chomp; my @cts; my ($t, $p, $s, $d) = (/^([A-Z]\d\d)\s+ # $t (1?\d)\s+ # $p (\d?\d(?:\.1)?)\s+ # $s ([0-3])\s+ # $d (?{@cts = $' =~ m#(\d?\d\.\d)#g}) # @cts /x) or ($bad{$_}++) && next; print join(' ', @cts); print "\n"; } print "\nPrinting bad lines:\n"; while (my ($k, $v) = each %bad){ print "$k: $v\n"; } __DATA__ C31 6 3 2.4 1.5 2.6 C32 2 7 3 1.0 H31 1 1 0 21.0 11.2 5.3 1.4 T11 2 1 0 6.0 1.1 2.2 L06 1 1 0 1.0 3.3 L06 1 4 0 1.1 1.8 __END__ 1.0 21.0 11.2 5.3 1.4 6.0 1.1 2.2 1.0 3.3 1.1 1.8 Printing bad lines: C31 6 3 2.4 1.5 2.6 : 1
On one long line, the regex would look like this (note I've replaced your literal spaces with \s):
/^([A-Z]\d\d)\s+(1?\d)\s+(\d?\d(?:\.1)?)\s+([0-3])\s+(?{@cts = $' =~ m +#(\d?\d\.\d)#g})/
-stevieb
In reply to Re: validate variable-length lines in one regex?
by stevieb
in thread validate variable-length lines in one regex?
by uhClem
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |