----- Original Message ----- 
From: "Pedro Antonio Reche" <[EMAIL PROTECTED]>
Newsgroups: perl.beginners
To: <[EMAIL PROTECTED]>
Sent: Friday, June 18, 2004 9:43 AM
Subject: puzzled


> Hi there, I am puzzled by the 'build_seq' subroutine in following code.
> #!/usr/sbin/perl -w
> use strict;
> use vars qw($USAGE);
>
> # random sequence generator #
> # -c=1 option will cause prot sequences to be built
> # using vertebrate aa frequencies,
> # with option -a putting a 1st methionine residues on. Frequencies are
> # calculated from the NCBI human RefSeq protein sequences
> # -c and -a only affect protein sequences
> # -a only works in conjunction with -c
> # -n number of random sequences, default = 1
>
> use Getopt::Long;
> my ($length,$type,$filename,$comp,$met);
>
> $USAGE = 'usage: generate_random_seq.pl --length=1000 --type=dna
> --filename=/tmp/test.seq --number=50';
>
> my %alphabets = ( 'dna' => [qw(C A G T)],
>                   'rna' => [qw(C A G U)],
>                   'prot'=> [qw( A C D E F G H I K L M N P Q R S T V W Y)],
>               );
> # make random num from 1-10000. numbers in this array reflect the
frequency,
> # e.g., a random number from 1.744 = A, 745-991 = C etc;
> my @aa_frequencies = qw(744 991 1398 2017 2378 3104 3349 3726 4239 5273
> 5443
>                         5749 6410 6848 7455 8263 8760 9340 9488 9713
10000);
> my $number = 1;
>
> &GetOptions
>   (
>    'l|length:s'          => \$length,
>    't|type|m|alphabet:s' => \$type,
>   );
>
> assert ( $type && defined ($alphabets{lc $type}),
>          $USAGE);
> assert ( $length && $length =~ /^\d+$/, $USAGE );
>
> foreach my $num (1..$number) {
>    my $sequence = "";
>    my $alphabet = $alphabets{lc $type};
>    my $sspace = scalar @$alphabet;
>    if (!$comp || $type ne 'prot') {

As far as I can tell, $comp is never assigned a value, so !$comp is true and
this branch of the if statement is executed even when type is 'prot'. The
branch below, 'build_seq($length, [EMAIL PROTECTED])', is never reached when
type = prot (because $comp is undefined).


>       foreach ( 1..$length ) {
>          $sequence .= $alphabet->[ int rand($sspace) ];
>       }
>    }elsif ($type eq 'prot') {
>       ($sequence) = build_seq($length, [EMAIL PROTECTED]);
>         print "yes $sequence\n\n\n";
>    }
>     print "$sequence\n";
> }
> sub assert { die $_[1] unless( $_[0] ); }
> sub build_seq {
>    #takes seqlen and ref to frequency data as parameters
>    my ($len, $pf)  = @_;
>    my $str;
>    my  $i;
>    $i = 2; #1
>    for ($i .. $len-1) {
>       print "$i\n";
>           my $aa = int(rand (10000)) ;
>       my $j = 0;
>       while ($pf->[$j] < $aa && $j <19) {
>          $j++;
>       }
>       $str .= $alphabets{'prot'}[$j];
>    }
>    print "str is $str\n"; #2
>    #return $str; # 3
> }
> I run the program as
> ./program.pl --type prot --length 9
> and the program spit out a random string of 9 characters such as
> KWNNNPITS
>
> However, the string should be of 7 characters ($i = 2 in # 1), print
> does not work within the subroutine (#2). and subroutine is returning a
> value despite return is commented out (#3). Does anyone understand why
> this is working this way?
> Thanks in advance for any insight.
> Cheers
>

Hope this fixes your problem,
Chris



-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to