#!/usr/bin/perl use warnings; use strict; sub parse_host_cfg { my ($file) = @_; my %fields; HOST_CFG_LOOP: while ( my $line = <$file> ) { chomp $line; last HOST_CFG_LOOP if ( $line =~ /\A\s*}/ ); if ( my ($name, $value) = $line =~ /^([-\w\s]+) "?(.*?)"?;/ ) { $fields{$name} = $value; } else { warn "invalid host config line: $line"; } } return \%fields; } sub parse_cfg_file { my %hosts; my ($file) = @_; while ( my $line = <$file> ) { chomp $line; if ( my ($hostid) = $line =~ /^host\s+(\w+)\s+{/ ) { my $host_cfg = parse_host_cfg( $file ); $hosts{$hostid} = $host_cfg; } } return \%hosts; } use Data::Dumper; print Dumper parse_cfg_file( *DATA ); __DATA__ # Host 1 host 45583 { filename "junk1.cm"; hardware ethernet 11:42:a3:d4:55:83; fixed-address 10.100.34.114; } # Host 2 host D78C3 { filename "junk5.cm"; fixed-address 10.100.34.117; hardware ethernet 11:42:a3:FD:78:C3; aklsjdhflkajsdfhlkjh } } # Host 3 host 3A684 { filename "junk6.cm"; fixed-address 10.100.34.119; hardware ethernet 11:42:a3:13:a6:84; } # Host 4 host 46d54 { filename "junk4.cm"; fixed-address 10.100.34.120; hardware ethernet 23:10:3d:14:6d:54; }