Your skill will accomplishwhat the force of many cannot PerlMonks

### Re: Re: Progressive pattern matching

by blakem (Monsignor)
 on Oct 17, 2001 at 15:33 UTC ( #119368=note: print w/replies, xml ) Need Help??

in reply to Re: Progressive pattern matching

Ugh, its too late to finish my golf game....
warning: not necessarily portable since it uses 'glob'.
```#!/usr/bin/perl -w

use strict;

my \$seq="APKLGIYSPRIGLYHFHKLDTPRLGAKLJHHDGFYSDA";
my @motif=("ST","P","RK","ILVF","G","ILVFM","Y");
my @a = my @b = my @c = @motif; my %m;

while(my\$r=!\$|++&&\@a||pop@a&&\@a||shift@b&&\@b){for(glob('{'.
join('',map{'{'.(join',',split(//)).'}'}@\$r).'}')){length(\$_)>
2&&\$seq=~/\$_/&&\$m{\$_}++;}}for(sort{length(\$b)<=>length(\$a)}keys
%m){print"\$_ at ",index(\$seq,\$_)+1,"\n"}

=OUTPUT
SPRIGLY at 8
PRIGLY at 9
PKLGIY at 2
SPRIGL at 8
KLGIY at 3
RIGLY at 10
SPRIG at 8
TPRLG at 21
TPRL at 21
IGLY at 11
LGIY at 4
SPRI at 8
GFY at 33
GIY at 5
TPR at 21
GLY at 12
SPR at 8

-Blake

Replies are listed 'Best First'.
Re: Re: Re: Progressive pattern matching
by tfrayner (Curate) on Oct 17, 2001 at 17:25 UTC
Heh - nice.

I knew there must be a shorter solution. I won't comment on whether it's simpler, but I know which I think is more readable :-). However, I note that your solution is in fact technically a little more complete than mine. My script misses substrings that aren't at the end of matches (i.e. will match GLY in SPRIGLY but not SPR). Neither script matches PRI, RIG or IGL in the above.

Although why you might want to do this (save for the sake of programming elegance) I'm not sure :-P

About my only contribution (since it's going to take me a little while to fully comprehend the golf) is that the @c array appears to be dispensable.

Tim

It took me longer than I thought to get this working last night... I therefore had to cut the actual golfing part short. Here is an updated version after spending a few minutes trimming chars.
```#!/usr/bin/perl -w
use strict;

my \$s   = "APKLGIYSPRIGLYHFHKLDTPRLGAKLJHHDGFYSDA";
my @m = ( "ST", "P", "RK", "ILVF", "G", "ILVFM", "Y" );

@"=@'=@m;my%m;while(\$"=!\$:--&&\@"||pop@"&&\@"||shift@'&&\@'){length(\$_
+)>2&&
\$s=~\$_&&\$m{\$_}++for(glob'{'.join('',map{'{'.(join',',split(//)).'}'}@{
+\$"}).
'}')}for(sort{length(\$b)-length(\$a)}keys%m){print"\$_ at ",index(\$s,\$_)
++1,\$/}

=OUTPUT
SPRIGLY at 8
PRIGLY at 9
PKLGIY at 2
SPRIGL at 8
KLGIY at 3
RIGLY at 10
SPRIG at 8
TPRLG at 21
TPRL at 21
IGLY at 11
LGIY at 4
SPRI at 8
GFY at 33
GIY at 5
TPR at 21
GLY at 12
SPR at 8
Basically, we loop through a set of munged @motif arrays transforming them into glob strings which happen to spit out the various substrings we're looking for.

-Blake

Create A New User
Node Status?
node history
Node Type: note [id://119368]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (5)
As of 2020-05-31 10:53 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
If programming languages were movie genres, Perl would be:

Results (173 votes). Check out past polls.

Notices?