sub conflicts { my ($a, $b) = @_; my ($ai, $bi) = (0,0); my @conflicts; while (defined $a->[$ai] && defined $b->[$bi]) { my ($ac, $bc) = ($a->[$ai], $b->[$bi]); # high and low line numbers for chunks a and b my ($al, $ah) = ($ac->[0][1], $ac->[-1][1]); my ($bl, $bh) = ($bc->[0][1], $bc->[-1][1]); if ($ah < $bl) { # chunk a precedes chunk b ++$ai; } elsif ($al > $bh) { # chunk a follows chunk b ++$bi; } else { # chunks overlap # compare the two chunks for conflicts my %h; for my $line (@$ac) { my ($s, $ln, $t) = @$line; $h{$ln}{$s} = $t; } for my $line (@$bc) { my ($s, $ln, $t) = @$line; next unless exists $h{$ln}; if (exists $h{$ln}{$s} && $h{$ln}{$s} ne $t) { push @conflicts, [[$s, $ln, $h{$ln}{$s}], [$s, $ln, $t]]; } } ++$ai; ++$bi; } } return @conflicts; }