use strict; use warnings; use Algorithm::Diff qw/LCS LCSidx/; # set 1 my $st1 = 'SALMWN DE EGENNHSEN TON BOOZ EK THS RAXAB BOOZ DE EGENNHSEN TON WBHD EK THS ROUQ WBHD DE EGENNHSEN TON IESSAI'; my $st2 = 'SALMWN DE EGENNHSEN TON BOES EK THS RAXAB BOES DE EGENNHSEN TON IWBHD EK THS ROUQ IWBHD DE EGENNHSEN TON IESSAI'; # set 2 my $st3 = 'IOUDAS DE EGENNHSEN TON FARES KAI TON ZARA EK THS QAMAR FARES DE EGENNHSEN TON ESRWM ESRWM DE EGENNHSEN TON ARAM'; my $st4 = 'IOUDAS DE EGENNHSEN TON FARES KAI TON ZARA EK THS QAMAR FARES DE EGENNHSEN TON ESRWM ESRWM DE EGENNHSEN TON ARAM'; print join "\n", all ($st3, $st4); print "\n\n\n"; print join "\n", all ($st1, $st2); sub all{ my @seq1 = split / +/, $_[0]; my @seq2 = split / +/, $_[1]; my $idx = LCSidx( \@seq1, \@seq2 ); my $index = 0; my $result; for (@$idx){ if ($_ == $index){ $result .= $seq1[$_].' '; $index++; }else{ $result .= "\n"; $index = $_ + 1; } } chop $result; return split / ?\n+/, $result; #in order seen #or #return sort {length $b <=> length $a} split / ?\n+/, $result; #sorted by length } #### sub all{ my @seq1 = split / +/, $_[0]; my @seq2 = split / +/, $_[1]; my $idx = LCSidx( \@seq1, \@seq2 ); my @result = (' ') x @seq1; @result[@$idx] = @seq1[@$idx]; return split / {2,}/, join ' ', @result; #in order seen #or return sort {length $b <=> length $a} split / {2,}/, join ' ', @result; #sorted by length }