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 #### $VAR1 = { 'IBM ' => [ 'February', 'March', 'July' ], 'Oracle' => [ 'January', 'March', 'April', 'May' ], 'RedHat ' => [ 'March', 'June', 'August' ] };