http://www.perlmonks.org?node_id=1011022


in reply to Is there any API available in perl to find longest common substring from two strings

Hello rad_144, and welcome to the Monastery!

For finding the longest common substring, see the thread finding longest common substring which I referenced in my recent post Re^13: partial match between 2 files.

Update (1st January, 2013): After the comedy of errors documented in the updates to Re^13: partial match between 2 files, I finally came up with a solution using my own advice:

#! perl use Modern::Perl; my @paths = ( '/home/instance/domains/abcd/xyz/1.txt', '/a1234/domains/abcd/xyz/1.txt', '/a1234/topfolder/instance/domains/abcd/xyz/1.txt', # '/a1234/topfolder/instance/domains/abcd/xyz/2.txt', ); my $lcss = lcss($paths[0], $paths[1]); my $found = defined $lcss && $paths[0] =~ / \Q$lcss\E $ /x && $paths[1] =~ / \Q$lcss\E $ /x; if ($found) { for (@paths[2 .. $#paths]) { $lcss = lcss($lcss, $_); unless ($lcss && / \Q$lcss\E $ /x) { $found = 0; last; } } } say $found ? 'Found common path+file: ' . $lcss : 'No common path+file found'; # lcss() was written by BrowserUk, see [id://308451] sub lcss { my $strings = join "\0", @_; my $lcss; for my $n (1 .. length $strings) { my $re = "(.{$n})" . '.*\0.*\1' x (@_ - 1); last unless $strings =~ $re; $lcss = $1; } return $lcss; }

Uncomment the 4th path, and the match fails, as it should.

Hope that helps,

Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

  • Comment on Re: Is there any API available in perl to find longest common substring from two strings
  • Download Code

Replies are listed 'Best First'.
Re^2: Is there any API available in perl to find longest common substring from two strings
by rad_144 (Initiate) on Jan 03, 2013 at 11:51 UTC
    Thanks for the code snippets. It really helped.