my $user; my %uservariables; while(){ chomp; my ($key, $value) = m{^<([^>]+)>(.*)<}i or die $_; $key = lc $key; #to adjust for case differences if ($key eq "userid"){ $user = $value; next; } $uservariables{$user}->{$key}=$value; } use Data::Dumper; print Dumper(\%uservariables); __DATA__ 46786 2004-10-21TO09:57:25Z Some Text some string some string 57864 2004-10-25TO09:57:25Z Some Text some string 46786 some string some string 98766 2004-10-21TO09:57:25Z Some Text some string some string some string some string 57864 some string some string