use warnings; use strict; use Data::Dumper; my %hoh; while() { chomp( my @fields = split /-/, $_ ); push @{ $hoh{$fields[0]}->{$fields[1]} }, $fields[2] } print Dumper \%hoh; __DATA__ comp1-cmd1-test1 comp1-cmd1-test2 comp1-cmd2-test1 comp2-cmd1-test1 comp2-cmd1-test2 comp3-cmd1-test1