foreach my $file (@filenames) { my $h = \%files; my @parts = split(/[-_.]/,$file); my $last = pop(@parts); foreach (@parts) { $h->{$_} ||= {}; $h = $h->{$_}; } $h->{$last} = 1; }