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 #### $VAR1 = { 'var' => { 'www' => { 'data' => { 'misc' => undef, 'stuff' => undef } }, 'logs' => { 'data' => undef } } }; #### perl -MData::Dumper -ne'END{print Dumper$t}chomp;$p=\$t;$p=\($$p->{$_})for/[^\/]+/g' #### perl -MData::Dumper -nlE'END{say Dumper$t}$p=\$t;$p=\($$p->{$_})for/[^\/]+/g'