Question: Perl: Implementing A Circular List /Circular Iteration
1
Neal40 wrote:

Hello all,

I need a bit of help implementing a circular list or perhaps a circular iteration( whichever can get the job done)

What is required
For a given peptide string , find all the possible sub-peptides including single amino acids and print their masses. For example's sake let's say `A = 1, B = 2, C = 3, D = 4`

eg

Input: A cyclic peptide :

`ABCD`

Output

``````A  B  C  D  AB  BC  CD  DA  ABC  BCD  CDA  DABC
1  2  3  4  3   5   7   5   6    9    8    10
``````

I initially tried implementing a simple `substr` based approach. The pseudocode is as under. So it is untested:

``````my \$i =0;
my \$j = 1;
my %peptide;
my \$len = length \$_; # \$_ being the input peptide string
while( \$i <= \$len-1 ) {

my \$mass = 0;
while( \$j <= \$len-1 ){
my \$substr = substr \$_, \$i, \$j   if ( \$i != \$len -1 && \$j  < \$len-1 )
my \$amino_acid_mass = subMass (\$substr) ;
my \$mass += \$amino_acid_mass;

push @{\$peptide{\$mass}}, \$substr ; # because multiple sub-peptides can have same mass
\$j++;

#To perform a very poor version of circular iteration
#if at last element 'N' , take out that element + add it to first  'N-2' elements
if( \$j == \$len-1 && \$i == \$len ){

my \$substr_L = substr \$_, \$i, 1;# last 1 element
my \$substr_F = substr \$_, 0, \$j-2  #first 2 elements
my \$string = \$substr_L.\$substr_F # append
#Extract mass and add to the %peptide hash
}
}
\$i++;
}
``````

Clearly this isn't the most elegant nor a fully working idea. It would break easily at peptide length > 3 ( 0,1,2,3). Furthermore, even the subroutine will break quickly as I realized later that a variable length `\$substr` would be its input.

So I thought perhaps I should implement an array. I searched on how to implement a circular array. This is what I came up with after finding a bit of hint in the Perl Cookbook online... :

``````my @arr = qw/A B C D/;
my \$i = 0;
while(\$i <= \$#arr ){
unshift(@arr, pop(@arr) );
say "@arr";

my \$y = 0;
my \$z = 1;

foreach (@arr){

say "Element : \$_";
say "2 elements: \$arr[\$y]\$arr[\$z] " if exists \$arr[\$z];
\$y++;
\$z++;
}
\$i++;
}
``````

But really I am stuck now and just cannot figure out what to do next or how to proceed further. I would be really grateful for any help or guidance.

perl list • 2.4k views
modified 6.0 years ago by Michael Dondrup46k • written 6.0 years ago by Neal40

This looks like one of the assignments from Bioinformatics Algorithms on coursera

It does...I want to get better at programming. I am stuck in this...

Right now I am just thinking of working on the assignments ;)

Yes !! And we may get many questions here from Coursera Assignments !! ;)

Ah so long as one wants to improve!

1
Michael Dondrup46k wrote:

Hint: Try to concatenate the string with itself.

Many many thanks Michael :)

It took me some time to understand what you meant and how it would help. But I did it! Finally! yay!

1

Nice it helped without spoiling the question :)