#!/usr/bin/perl use warnings; use strict; my %user_data; my $current_user; while () { if (my ($elem, $content) = m|^ <([^>]+)> (.*) |x) { $current_user = $content if $elem eq "UserID"; $user_data{$current_user}{$elem} = $content; } else { print "Bad line $.: $_"; } } use Data::Dumper; print Dumper(\%user_data); # $VAR1 = { # '98766' => { # 'var6' => 'some string', # 'var1' => 'some string', # 'dev' => 'Some Text', # 'UserID' => '98766', # 'var2' => 'some string', # 'var5' => 'some string', # 'start' => '2004-10-21TO09:57:25Z' # }, # '57864' => { # 'var6' => 'some string', # 'var1' => 'some string', # 'dev' => 'Some Text', # 'var4' => 'some string', # 'UserID' => '57864', # 'start' => '2004-10-25TO09:57:25Z' # }, # '46786' => { # 'var3' => 'some string', # 'var1' => 'some string', # 'dev' => 'Some Text', # 'var4' => 'some string', # 'UserID' => '46786', # 'var2' => 'some string', # 'start' => '2004-10-21TO09:57:25Z' # } # }; __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