#!/usr/bin/perl
use strict;
use warnings;
my @var;
$var[0] = "Gallia est omnis divisa in partes tres";
$var[1] = "Gallia est omnis divisa in ...";
$var[2] = "Gallia est omnis ...";
$var[3] = "Gallia ...";
$var[4] = "... omnis divisa in ...";
$var[5] = "Gallia est ... tres";
$var[6] = "Gallia ... partes tres";
$var[7] = "Gallia est ... partes tres";
$var[8] = "Gallia ... divisa ... tres";
$var[9] = "... tres";
$var[10] = "quattuor";
for my $i (0 .. $#var) {
for my $j ($i+1 .. $#var) {
print "$i - $j DO NOT MATCH!\n" unless compare($var[$i], $var[$j]);
}
}
sub compare {
my @str1 = split /\Q...\E/, shift, -1;
my @str2 = split /\Q...\E/, shift, -1;
if (@str1 == 1) { # Regex is possible
local $" = ".+";
return $str1[0] =~ /^@str2$/;
} elsif (@str2 == 1) { # Regex is still possible
local $" = ".+";
return $str2[0] =~ /^@str1$/;
} else { # Fragment matching
# Openings must be consistent
if (length $str1[0] > length $str2[0]) {
return if index($str1[0], $str2[0]) != 0;
} else {
return if index($str2[0], $str1[0]) != 0;
}
# Closings must be consistent, start search from end
if (length $str1[-1] > length $str2[-1]) {
return if index(reverse($str1[-1]), reverse($str2[-1])) != 0;
} else {
return if index(reverse($str2[-1]), reverse($str1[-1])) != 0;
}
}
return 1;
}
####
0 - 10 DO NOT MATCH!
1 - 10 DO NOT MATCH!
2 - 10 DO NOT MATCH!
3 - 10 DO NOT MATCH!
4 - 10 DO NOT MATCH!
5 - 10 DO NOT MATCH!
6 - 10 DO NOT MATCH!
7 - 10 DO NOT MATCH!
8 - 10 DO NOT MATCH!
9 - 10 DO NOT MATCH!
####
0 - 10 DO NOT MATCH!