use warnings; use strict; use Data::Dumper; my %clients; while () { my ($client, $rest) = split /\|/; $rest =~ s/\s+//g; my @months = split /\d+/, $rest; $clients{$client} = \@months; } print Dumper \%clients; __DATA__ IBM | February 1 March 5 July 4 Oracle| January 3 March 4 April 6 May 5 RedHat | March 2 June 3 August 1