I've got a data file that for the most part, the entries look like: (The last 3 columns are data points...)
LKG_535 P10X0.6 -2.00E-09 0.00E+00 amps -3.800E-13 -3.920E-12 -7.800E-13 VT_GM L0.8H40 -1.15E+00 -7.50E-01 volts -1.104E+00 -1.111E+00 -1.110E+00 IDSAT_5 Y0.8N20 -5.80E-03 -3.00E-03 amps -5.036E-06 -5.001E-06 -4.853E-06 VT_GP P0.8X.6 -1.15E+00 -7.50E-01 volts -1.018E+00 -9.966E-01 -1.012E+00 LOGU_I I2.00.6 6.00E-03 1.00E-02 amps 8.992E-03 8.939E-03 8.903E-03 which I match with the following: # RE for a valid floating point number $fp = qr/[+-]?\ *(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?/; # Case for 3 data points if $line =~ /(.{9})\s+(.{10})\s+.{4}\s+($fp)\s+($fp)\s+(.{8})\s+($fp)\s+($fp)\s+($fp)\s+ $/o) { $datapts = 3 #Insert matched vars into Class::Struct array... ... } But optionally, and once in a while there might be a line that looks like: (this case shows 3 extra columns [data points], but in reality there could be 1,3 or 5 more columns) HGYPG5 M1_LG OT 0.00E+00 2.00E-08 amps 1.000E-06 4.000E-11 2.000E-11 6.000E-11 4.000E-11 8.000E-11 I know I can write an if() clause to match every possible case, but I'm wondering if there is a more general approach that would allow me to dynamically match a varying number of extra columns within a single expression. Thanks, -Dan Here a suggestion.... #! /usr/local/bin/perl open PNTS,"points.dat" or die "Open failed"; @jumps=(\&p8,\&p9,\&p10,\&p11,\&p12); while (<PNTS>) { @points = split /\s+/; print "entries =<", scalar(@points) - 8, ">\n"; &{$jumps[scalar(@points) - 8]} if scalar(@points) > 7 && scalar(@points) < 13; } sub p8{print "8 values\n";} sub p9{print "9 values\n";} sub p10{print "10 values\n";} sub p11{print "11 values\n";} sub p12{print "12 values\n";} I hope this gives you some ideas ... jwm -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>