G'day seismofish,
Welcome to the Monastery (at least with respect to posting).
You can use constants to avoid:
-
The need to reference capture variables; e.g. ($1,$2,$3,$4,$5,$6,$7).
-
The need to declare and define a list of variables;
e.g. ( $mon, $day, $time, $interface, $rate, $duplex, $lpa ).
-
The use of named captures requiring a multitude of ?<NAME> added to your regexes.
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