use v5.10;
use warnings;
use Regexp::Grammars;
my $grammar = qr{
\A <IP4_addr> \Z
<token: quad>
<MATCH=( \d{1,3} )>
<require: (?{ $MATCH < 256 })>
<token: IP4_addr>
<[MATCH=quad]>+ % (\.)
<require: (?{ @$MATCH == 4 })>
}xms;
while (my $line = <>) {
if ($line =~ $grammar) {
use Data::Dumper 'Dumper';
say Dumper \%/;
}
}