Re: How to put brackets in a string given substrings
- From: krahnj@xxxxxxxxx (John W. Krahn)
- Date: Fri, 28 Oct 2005 03:42:11 -0700
Wijaya Edward wrote:
>
> I have the following problem.
> I am trying to put the bracket in a string given the set of its substrings.
> Those bracketed region is "bounded" by the given substrings.
> Like this, given input "String" and it's "substrings"
>
> String
> 1.CCCATCTGTCCTTATTTGCTG
> 2.ACCCATCTGTCCTTGGCCAT
> 3.CCACCAGCACCTGTC
> 4.CCCAACACCTGCTGCCT
> 5.CTGGGTATGGGT
> 6.AGGAACTTGCCTGTACCACAGGAAG
>
> Substrings:
> 1. ATCTG ATTTG
> 2. CCATC
> 3. CCACC CCAGC GCAAC
> 4. CCAAC ACACC
> 5. GTATG TGGGT
> 6. CAGGA AGGAA
>
> The desired answer are:
> 1. CCC[ATCTG]TCCTT[ATTTG]CTG
> 2. AC[CCATC]TGTCCTTGGCCAT
> 3. [CCACCAGCACC]TGTC *
> 4. C[CCAACACC]TGCTGCCT *
> 5. CTGG[GTATGGGT] **
> 6. AGGAACTTGCCTGTACCA[CAGGAA]G **
>
> Please note that in example 3 and 4 the substrings are "overlapping".
> Pay attention also to for example 5 and 6, there exist substrings that occur
> twice. So the answer for example 5 and 6 are NOT
>
> 5. C[TGGGTATGGGT] ----this is wrong
> 6. [AGGAA]CTTGCCTGTACCA[CAGGAA]G ----this is wrong
>
> Since they do not follow the order from the given substrings (array -- see my code).
> Below is my code. It only work for example 1 and 2.
> How can I approach this problem so that it can handle all those cases?
>
>
> __BEGIN__
> #!/usr/bin/perl -w
> use strict;
>
> my $s1 ='CCCATCTGTCCTTATTTGCTG'; my @a1 = qw(ATCTG ATTTG);
> my $s2 ='ACCCATCTGTCCTTGGCCAT'; my @a2 = qw(CCATC);
> my $s3 ='CCACCAGCACCTGTC'; my @a3 = qw(CCACC CCAGC GCACC);
> my $s4 ='CCCAACACCTGCTGCCT'; my @a4 = qw(CCAAC ACACC);
> my $s5 ='CTGGGTATGGGT'; my @a5 = qw(GTATG TGGGT);
> my $s6 = 'AGGAACTTGCCTGTACCACAGGAAG'; my @a6 = qw( CAGGA AGGAA );
>
> #These two work fine.
> put_bracket($s1,\@a1);
> put_bracket($s2,\@a2);
>
> #But these the rest don't work
> put_bracket($s3,\@a3);
> put_bracket($s4,\@a4);
> put_bracket($s5,\@a3);
> put_bracket($s6,\@a4);
>
> sub put_bracket
> {
> my ($str,$ar) = @_;
> my $bstr;
> my $slen = length $ar->[0];
>
> foreach my $subs ( @$ar )
> {
> my $idx = index($str,$subs);
> my $bgn = $idx;
> my $end = $idx+$slen+1;
> substr($str,$bgn,0,"[");
> substr($str,$end,0,"]");
> }
> print "$str\n";
> return ;
>
>
> __END__
>
> Really hope to hear from you again.
This appears to do what you want:
sub put_bracket {
my ( $str, $ar ) = @_;
my $x = 0;
for my $subs ( @$ar ) {
if ( substr( $str, $x ) =~ /$subs/i ) {
$x += $-[ 0 ];
substr( $str, $x, length $subs ) =~ tr/A-Z/a-z/;
}
}
$str =~ s/([a-z]+)/[\U$1\E]/g;
print "$str\n";
return;
}
John
--
use Perl;
program
fulfillment
.
- Follow-Ups:
- Input Example Errata -- How to put brackets ....
- From: Edward WIJAYA
- Re: How to put brackets in a string given substrings
- From: Edward WIJAYA
- Input Example Errata -- How to put brackets ....
- Prev by Date: about running unix command in perl script
- Next by Date: about man page
- Previous by thread: help slurping a file
- Next by thread: Re: How to put brackets in a string given substrings
- Index(es):
Relevant Pages
|
|