use strict; use warnings; use List::Util qw(min); use Data::Dumper; my $seq1 = { id => 1, start => 0, seq => 'CTGCCACCGCTGT' }; my $seq2 = { id => 1, start => 5, seq => 'ACCGCTGTGTTTCGGCCGGCGA'}; print Dumper [ intersection($seq1, $seq2) ]; sub intersection { # make sure that seq1 is always the first # subsequence my ($seq1, $seq2) = sort {$a->{start} <=> $b->{start} }@_; # determine the start of intersected string ... my $i_start = $seq2->{start} - $seq1->{start}; # ... and the length my $i_length = min(length(substr($seq1->{seq},$i_start)), length($seq2->{seq})); return ($i_start+1, substr($seq2->{seq}, 0, $i_length)); }