----- 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>