use 5.20.0; use warnings; my @items = <>; use List::AllUtils qw/ pairwise /; use experimental qw/ signatures postderef current_sub /; while( my $next = shift @items ) { my $match = find([ split '', $next], @items) or next; say $match; last; } sub find( $next, @items ) { my $contender = splice @_, 1, 1 or return; $contender = [ split '', $contender ]; my $diff = 0; my $r = ''; for my $i ( 0..$next->@* ) { if ( $next->[$i] eq $contender->[$i] ) { $r .= $next->[$i]; } else { last if $diff++; } } return $r if $diff == 1; goto __SUB__; }