use strict; use warnings; use Parse::RecDescent; use Data::Dumper; $::RD_AUTOACTION = q { [@item] }; my $parse = Parse::RecDescent->new (q { config: section(s) /\z/ section: server | key server: 'bind-server' ip { [@item[0,2]] } ip: ascii_byte '.' ascii_byte '.' ascii_byte '.' ascii_byte { join ('', @item[1..7]) } ascii_byte: /\d+/ 255}> { $item[1] } key: 'tsig-key' filename { [@item[0,2]] } filename: '"' /[^"]+/ '"' { $item[2] } | /[^"\s]+/ { $item[1] } }); print Dumper $parse->section (' bind-server 127.0.0.1 tsig-key "/etc/bind/rndc.key" ');