in reply to weird subroutine behavior
Your logic is hard to follow, and I'm not certain exactly what you are trying to do with this. It looks like you are trying to find all of the common sub sequences of words (sorted by length?). You may be better off using a module to help with that. Algorithm::Diff seems a likely candidate.
Something like this perhaps.
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 FAR +ES DE EGENNHSEN TON ESRWM ESRWM DE EGENNHSEN TON ARAM'; my $st4 = 'IOUDAS DE EGENNHSEN TON FARES KAI TON ZARA EK THS QAMAR FAR +ES 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; #so +rted by length }
Or, more succinctly...
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 ' ', @re +sult; #sorted by length }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: weird subroutine behavior
by flaviusm (Acolyte) on Apr 02, 2008 at 16:10 UTC |