use strict; my $sampleXML = qq( Test Consors Test Portfolio -5124.88530628508 129.39826419201 114260.469443242 68.4645462588067 -2131.56017715564 Bayer -197.254957013363 148.955450569846 6138 -0.00822567904632093 Bond -157.580177492695 29.3498701802706 18922.4694432424 ); $portresults = parsePortfolioResponse($sampleXML); sub parsePortfolioResponse { my $response = $_[0]; my %portresults; my $stats = "riskgrade|riskimpact|xloss|value|divriskgrade|divxloss|posID"; #assumes portstats come first my $ref = "portfolio"; while ($response =~ m!<($stats)>(.*?)!g) { if ($1 eq "posID") { $ref = $2; } else { $portresults{$ref}->{$1} = $2 if $2; } } return \%portresults; } ###END SAMPLE CODE