network_object: 'network' ':' /(\w+)/ '=' '{' ip_def mask_def host(s) '}' #### host : 'host' ':' /\w+/ '=' '{' ip_or_range '}' #### ip_or_range : 'ip' '=' ip ';' | 'range' '=' ip '-' ip ';' #### my $grammar = <<'GRAMMAR'; parse: network_object(s) network_object: 'network' ':' /(\w+)/ '=' '{' ip_def mask_def host(s) '}' { $return = { NETWORK => $item[3], SUBNET => $item[6], NETMASK => $item[7], HOSTS => $item[8], }; } mask_def : 'mask' '=' ip ';' { $return = $item[3]; } ip_def : 'ip' '=' ip ';' { $return = $item[3]; } host : 'host' ':' /\w+/ '=' '{' ip_or_range '}' { $return = [$item[3], $item[6]]; } ip_or_range : 'ip' '=' ip ';' { $return = $item[3]; } | 'range' '=' ip '-' ip ';' { $return = {RANGE_START => $item[3], RANGE_END => $item[5]}; } ip : /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/ { $return = $item[1]; } GRAMMAR #### $VAR1 = [ { 'NETMASK' => '255.255.255.0', 'HOSTS' => [ [ 'asterix', '10.1.1.10' ], [ 'obelix', '10.1.1.11' ], [ 'idefix', '10.1.1.12' ], [ 'ix_13_20', { 'RANGE_START' => '10.1.1.13', 'RANGE_END' => '10.1.1.20' } ] ], 'NETWORK' => 'north', 'SUBNET' => '10.1.1.0' } ];