my $r; ... while( <> ) { chomp; $r = insert($r, split /[-_.]/, $_); } sub insert { my $r = shift; my $last = \$r; $last = \$$last->{$_} for @_; $$last ||= 1; $r; }