Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re: scan, match and extract

by kcott (Archbishop)
on May 19, 2022 at 14:43 UTC ( #11144011=note: print w/replies, xml ) Need Help??


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:

  • 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

— Ken

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11144011]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (4)
As of 2022-08-09 23:18 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?