WORKS: my @accounts = split /\n/, <{$id}->{info} = $rest; } for (@purchases) { my($id, $rest) = split /,/, $_, 2; push @{$accounts_by_id->{$id}->{purchases}}, $rest; } for (@accounts) { my($id, $rest) = split /,/, $_, 2; { my @five = splice @{$accounts_by_id->{$id}->{purchases}}, 0, 5; last unless @five; print "$id,$accounts_by_id->{$id}->{info},", join(',', @five), "\n"; print "
"; redo if @five == 5; } } RETURNS THE FOLLOWING: 1,joe,123 First St.,222,veg,01/05/05,444,fruit,02/04/05,555,bread,03/09/06,777,butter,05/07/05,888,spice,09/06/07 1,joe,123 First St.,999,coffee,02/06/05 2,mary,234 Second St.,444,veg,01/01/06 DOESN'T WORK: open( XLSFILE, $file ) or die "could not open $file $!"; open( XLSFILE2, $file2 ) or die "could not open $file $!"; my @accounts; my $accounts; my @purchases; my $purchases; while (){ @accounts = split /\n/,$_; foreach $accounts(@accounts) } while (){ @purchases = split /\n/,$_; } my $accounts_by_id = {}; for (@accounts) { my($id, $rest) = split /,/, $_, 2; $accounts_by_id->{$id}->{info} = $rest; } for (@purchases) { my($id, $rest) = split /,/, $_, 2; push @{$accounts_by_id->{$id}->{purchases}}, $rest; } for (@accounts) { my($id, $rest) = split /,/, $_, 2; { my @five = splice @{$accounts_by_id->{$id}->{purchases}}, 0, 5; last unless @five; print "$id,$accounts_by_id->{$id}->{info},", join(',', @five), "\n"; print "
"; redo if @five == 5; } } RETURNS THE FOLLOWING: 1,joe,123 First St. 2,mary2,234 Second St. 1,222,veg,01/05/05 1,444,fruit,02/04/05 1,555,bread,03/09/06 1,777,butter,05/07/05 2,444,veg,01/01/06 2,444,veg,01/01/06 2,444,veg,01/01/06 2,444,veg,01/01/06 2,444,veg,01/01/06 2,444,veg,01/01/06 2,mary2,234 Second St.,444,veg,01/01/06