On 01/04/2011 12:00, Anirban Adhikary wrote: > Hi List > > I am trying to parse the following file and load it into a hash. > > File Structure > > [snip data] > > Separater is colon(:) > > my code > > use strict; > use warnings; > my $fname = $ARGV[0]; > open my $RFH,'<',$fname; > > while (<$RFH>) { > next unless /:/ and my %field = /(.*?):(.*?)/mg; > foreach my $key (keys %field ) { > print "KEY=[$key]------VALUE=[$field{$key}]\n"; > } > } > > But I am not getting the desired result.
The code below seems to do what you want. Cheers, Rob use strict; use warnings; my $data; { local $/; $data = <DATA>; } my $key = qr/ (?: \w+ [ ] )* \w+ /x; my @xx = $data =~ /\G ( $key ) \s? : \s* (.+?) \s* (?= $key \s? : | \z)/sgx; while (@xx) { my ($key, $val) = splice @xx, 0, 2; printf "%s=%s\n", $key, $val; } __DATA__ DN: 2570764 (PORTED-IN) TYPE: SINGLE PARTY LINE SNPA: 438 SIG: DT LNATTIDX: 4 XLAPLAN KEY : 438CAUC1 RATEAREA KEY : ILEPEROT LINE EQUIPMENT NUMBER: LG 31 5 02 57 LINE CLASS CODE: 1FR IBN TYPE: STATION CUSTGRP: RESGRP SUBGRP: 0 NCOS: 1 LINE TREATMENT GROUP: 1 CARDCODE: RDTLSG GND: N PADGRP: PKNIL BNV: NL MNO: N PM NODE NUMBER : 387 PM TERMINAL NUMBER : 258 DNGRPS OPTIONS: NETNAME: PUBLIC ADDRESS: 5144254676 OPTIONS: COD DGT NAME PUBLIC HR BLOCK IMPOTS PIC 6885 Y RES OPTIONS: NONE OFFICE OPTIONS: U3WC AIN TIID **OUTPUT** DN=2570764 (PORTED-IN) TYPE=SINGLE PARTY LINE SNPA=438 SIG=DT LNATTIDX=4 XLAPLAN KEY=438CAUC1 RATEAREA KEY=ILEPEROT LINE EQUIPMENT NUMBER=LG 31 5 02 57 LINE CLASS CODE=1FR IBN TYPE=STATION CUSTGRP=RESGRP SUBGRP=0 NCOS=1 LINE TREATMENT GROUP=1 CARDCODE=RDTLSG GND=N PADGRP=PKNIL BNV=N L MNO=N PM NODE NUMBER : 387 PM TERMINAL NUMBER=258 DNGRPS OPTIONS=N ETNAME=PUBLIC ADDRESS=5144254676 OPTIONS=COD DGT NAME PUBLIC HR BLOCK IMPOTS PIC 6885 Y RES OPTIONS=NONE OFFICE OPTIONS=U3WC AIN TIID -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/