http://qs1969.pair.com?node_id=11144011


in reply to scan, match and extract

G'day seismofish,

Welcome to the Monastery (at least with respect to posting).

You can use constants to avoid:

Here's an example:

#!/usr/bin/env perl use strict; use warnings; use constant { MON => 0, DAY => 1, TIME => 2, INTERFACE => 3, RATE => 4, DUPLEX => 5, LPA => 6, }; use Test::More tests => 12; my $re_dn = qr{^(\w+) (\d+) (\d{2}:\d{2}:\d{2}) .*: eth(\d): link down +}; my $re_up = qr{^(\w+) (\d+) (\d{2}:\d{2}:\d{2}) .*: eth(\d): link up, +(\d+)Mbps, ([^,]+), lpa (\w+)}; my @logs = ( 'May 19 13:58:01 foo: eth0: link down', 'May 19 13:58:11 foo: eth0: link up, 100Mbps, bar, lpa quux', '# some comment in the logfile', ); for (@logs) { my @matches; if (@matches = /$re_dn/) { is $matches[MON], 'May'; is $matches[DAY], 19; is $matches[TIME], '13:58:01'; is $matches[INTERFACE], 0; } elsif (@matches = /$re_up/) { is $matches[MON], 'May'; is $matches[DAY], 19; is $matches[TIME], '13:58:11'; is $matches[INTERFACE], 0; is $matches[RATE], 100; is $matches[DUPLEX], 'bar'; is $matches[LPA], 'quux'; } else { is 0+@matches, 0; } }

Output:

1..12 ok 1 ok 2 ok 3 ok 4 ok 5 ok 6 ok 7 ok 8 ok 9 ok 10 ok 11 ok 12

— Ken