use 5.026; use warnings; use Data::Dumper; my @paths = qw{ /abc/def/ghi /wxy/z /usr/local/lib/x86_64-linux-gnu/perl/5.26.1 bin/fred somefile }; foreach my $path ( @paths ) { my @elems = split m{/}, $path; my @arr; while ( @elems ) { last if @elems == 1 && ! $elems[ 0 ]; # Ignore empty first element # if path starts with a / push @arr, join q{/}, @elems; pop @elems; } say $path; print Data::Dumper->Dumpxs( [ \ @arr ], [ qw{ *arr } ] ); say q{-} x 30; }