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: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/