use warnings; use strict; use Data::Dump::Streamer; my $data = < [ { 'LEVEL' => '12', 'CARNUM' => '1', 'REGIS#' => '1233456678987645RD ', 'ACCOUNT' => '6510334', 'YEAR' => '2008' }, { 'AMOUNT' => '200.00' }, { 'LEVEL' => '0', 'CARNUM' => '2', 'REGIS#' => '2234565478345R56T ', 'ACCOUNT' => '6510334', 'YEAR' => '2008' }, { 'AMOUNT' => '0.00' } ], DATA local $\; open my $InFile, '<', \$data; my $str = <$InFile>; close $InFile; no strict "vars"; eval "\%hash = ($data);"; my %accounts; while (@{$hash{main_data}}) { my ($accountInfo, $amount) = splice @{$hash{main_data}}, 0, 2; my $acct = $accountInfo->{ACCOUNT}; my $reg = $accountInfo->{'REGIS#'}; delete @{$accountInfo}{'ACCOUNT', 'REGIS#'}; $accounts{$acct}{$reg} = $accountInfo; $accounts{$acct}{$reg}{AMOUNT} = $amount->{AMOUNT}; } use strict; print "$accounts{6510334}{'1233456678987645RD '}{AMOUNT}";