use strict; use warnings; use Data::Dump qw(pp); my @paths = map { [ split '/' ] } qw[ /home/instance/domains/abcd/xyz/1.txt /a1234/domains/abcd/xyz/1.txt /a1234/topfolder/instance/domains/abcd/xyz/1.txt ]; #pp @paths; my $a_norm = shift @paths; my @result; dir_loop: for my $idx ( 1 .. @$a_norm ) { for my $a_path (@paths){ last dir_loop if $a_norm->[-$idx] ne $a_path->[-$idx]; } unshift @result,$a_norm->[-$idx] } pp @result;