in reply to Re^2: Identifying Overlapping Area in a Set of Strings
in thread Identifying Overlapping Area in a Set of Strings

How can I modify your code such that it simply gives: ...

Quite simple:

my @results; my %seen; for (1 .. $#nsub) { my $current = $nsub[$_]; my $previous = $nsub[$_ -1]; if ( "$previous#$current" =~ /(\w+)#\1/ ) { my $found = $1; printf "%d -> %s (%s) %d -> %s \n", $_ -1, $previous, $found, $_, $current; $current =~ s/^$found/"-" x length($found)/e; $previous =~ s/$found$/"-" x length($found)/e; push @results, [ $_ -1, $previous] unless $seen{$_ -1}++; push @results, [ $_, $current] unless $seen{$_}++; } else { printf "%d -> no overlap\n", $_ } } print Data::Dumper->Dump([ \@results], ['result']);

Replies are listed 'Best First'.
Re^4: Identifying Overlapping Area in a Set of Strings
by monkfan (Curate) on Jul 30, 2005 at 04:01 UTC
    Thanks so much again rnahi.
    I hope you don't mind looking at my other instances. I'm really sorry, I didn't mentioned it before because I thought it may appear too complex and too discouraging to read.
    Suppose I have this:

    I would like to produce this:

    Basically 'skipping' the asterisk(*) but yet still keep its position in array in place.

    Update: I've finally succeeded in improving your code such that it can take care those situations. It is not entirely neat and 'super-naive' but it does the job. I think I can't use "grep" function in this case because I still need to keep '*' in its position.

    My sincere thanks, for providing an excellent starting point to me.
    Here is the final code:

    Please kindly advice. Really hope to hear from you again.
    Regards,
    Edward