in reply to newb regular expression question
Which creates a hash of arrays of hashes of arrays and outputs thisuse strict; use Data::Dumper: my($lease, %info); while(<DATA>) { 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; }
$VAR1 = { '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"' ] } ], '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' ] } ], '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"' ] } ] };
See. perlre and the ever helpful YAPE::Regex::Explain for more info on the regexes used above and perlreftut, perldsc and tye's References quick reference for more info on data structures and dereferencing them.
HTH
_________
broquaint
update: modified code to store the per lease values as an array
|
|---|