#!/usr/bin/perl use strict; use warnings; print common_substr('ABCD', 4, 'BCD', 3, 2); { my %seen; sub common_substr { my ($str1, $len_str1, $str2, $len_str2, $len_subs) = @_; my $temp1 = exists $seen{$len_str1}{$len_subs} ? $seen{$len_str1}{$len_subs} : ($seen{$len_str1}{$len_subs} = ("a${len_subs}X" . ($len_subs - 1)) x ($len_str1 - $len_subs + 1)); my %substr; @substr{ unpack($temp1, $str1) } = (); my $temp2 = exists $seen{$len_str2}{$len_subs} ? $seen{$len_str2}{$len_subs} : ($seen{$len_str2}{$len_subs} = ("a${len_subs}X" . ($len_subs - 1)) x ($len_str2 - $len_subs + 1)); my $count = keys %substr; delete @substr{ unpack($temp1, $str2) }; return $count - keys %substr; } }