sub pointer_to_element { require List::Util; return List::Util::reduce(sub { \($$a->{$b}) }, \shift, @_); } #### while() { chomp; my @chunks = split /\:/; next unless @chunks > 1; # At least one key, please my $value = pop @chunks; push @{ pointer_to_element($DATA, @chunks) }, $value; }