use strict; use warnings; use Data::Dumper qw( Dumper ); sub add { my $p = \shift; $p = \($$p->{$_}) for @_; } my $tree; while () { chomp; add $tree, m{[^/]+}g; } print(Dumper($tree)); __DATA__ /var/www/data/stuff /var/www /var/www/data/misc /var/logs /var/logs/data