use strict; use Data::Dumper: my($lease, %info); while() { next unless (($lease) = /^lease \s+ ((?:\d+.?)+) \s+ \{$/x) .. /^\}$/; push @{ $info{$lease} } => { $1 => [split ' ', $2] } if /^\s+ (\S+) \s+ (.*);/x; } print Dumper(\%info); __DATA__ lease 10.2.56.40 { starts 3 2003/08/20 10:37:28; ends 3 2003/08/20 22:37:28; hardware ethernet 00:20:af:52:12:0f; uid 01:20:af:52:12:0f; client-hostname "Telephone"; } lease 10.2.56.75 { starts 3 2003/08/20 09:57:11; ends 3 2003/08/20 21:57:11; hardware ethernet 00:ef:18:ae:52:83; uid 01:00:ef:18:ae:52:83; client-hostname "beast"; } lease 10.2.56.77 { starts 2 2003/08/19 21:13:05; ends 3 2003/08/20 21:13:05; hardware ethernet 00:02:95:9b:78:18; uid 01:02:0b:95:9b:78:18; }