Borisz's script: #!/usr/bin/perl use Data::Dumper; my %products; while (defined( $_ = )){ next if $. <= 2 || /^\s*$/; my @d = split ' '; my $cat = shift @d; my $id = shift @d; push @{$products{$cat}}, [ $id, \@d ]; } print Dumper(\%products);