On 26 Feb 2007 at 18:13, D. Bolliger wrote: > Beginner am Montag, 26. Februar 2007 17:02: > > On 26 Feb 2007 at 15:58, D. Bolliger wrote: > > > Beginner am Montag, 26. Februar 2007 14:50: > > Hi > > > > > I am trying to parse some dhcp-lease files to extract the ip, mac and > > > > hostname. ..snip > > > Thanx Dani, > > > > That's worked a treat. Just to complete the learning curve, where was > > I going wrong? > > That should have been part of my first answer, sorry. I'll try and hope I > don't mess with the test versions and the english language :-) > > Looking at the regex: > > It only matches MACs without a-c hex digits (and there's no 'scien' string in > the data, but that's probably due to the altered hostnames, and I assume that > the \d{3} in the IP matching part is intended.). > > In the script version with $/ = '': > > This reads all records at once, and this seems to be the reason why you used > the /g modifier. But then, after matching the IP of the first lease, the > first .* will skip all leases except the last one for the mac/host matching. > So you (or I respectively) get a single wrong result with the IP of the > first lease and mac/host of the last lease (after correcting the mac regex > part). > So you would have to alter the .* into the non-greedy .*? (to avoid > skipping leases) and also append a .*? at the end of the regex to match what > is "between the leases" [argh!] (to avoid only one match). > > But even if the regex is correct, and the ip/mac/host of every lease is > matched, only the first 3 captured matches get stored into ($ip,$mac,$host), > and the others are discarded (which would not be the case with > @data=/....../g). > > When you tried with $/ = "}\n": > > I don't know neither how the regex looked like in this case, nor what went > wrong then, so I can't say much. > > Other notes: > > The $_=~ is not necessary, because if the left side of =~ is missing, $_ is > used by default. > > To read all leases, you could also do it like so to avoid the somehow > misleading while loop: > { > local $/; # sets $/ to undef > my $data=<FH>; # slurp entire file > # ...match with /g modifier... > } > > chomp is not necessary. > > Hope that covers the most important issues :-) > > Dani
Thanx Dani (and John) that's a very complete reply with a lot of useful stuff to bear in mind. There were a couple of errors that slipped in after I tried to ofuscate my domain and ip range but I was missing a great deal. Thanx again. Dp. -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/