my %hash; open(CMD1, "< test.txt"); while () { my @elts = split(/\|_\|/, $_, -1); my $p = \\%hash; $p = \( ${$p}->{$_} ) for @elts; } use Data::Dumper; print Dumper(\%hash);