Question: perl warning message
0
gravatar for ravihansa82
4.1 years ago by
ravihansa8260
Sri Lanka
ravihansa8260 wrote:

dear friends,

I need a help from you. I have written a perl program for KMP algorithm. program runs perfectly but it gives some warnings like, for a example as follows..

Replacement list is longer than search list at C:/Perl/site/lib/Bio/Range.pm line 251.
Use of uninitialized value in string ne at C:/Users/dell/workspace/subroutine/sub.pl line 99, <GEN0> line 2.
Use of uninitialized value in string ne at C:/Users/dell/workspace/subroutine/sub.pl line 99, <GEN0> line 2

...................................................................................................................................................

.................................................................................................................................................

-------------------------------------------------------------------------------------------

can somebody help me to get rid of this error...

thanks

#########################################################################################

here is the program

#!/usr/bin/perl -w

#use strict;
use Bio::SeqIO;
use Bio::Seq;

#my $seq_obj;
my $text;
my $pattern ="TATAAAT";
my $seq_obj;

open ("OUT_PUT",">C:\\Users\\dell\\Desktop\\GGGCGG.txt");

# defining the subroutine for prefix table for my pattern
sub PreprocessTable{
    
        # initializing first two valaue of the prefixtable array as -1 and 0
        my ($i,$j) = (0,-1);
    
        # converstion of pattern string into an array
        my @PtrnArray = split //,$pattern;
    
        # get the length/size of pattern array length
        my $PtrnArrayLength = scalar @PtrnArray;
        
        # initialize the Table array with known size(here the size of the array is 8) 
        # which is one index adding to the pattern array
        my @TableArray;$TableArray[$PtrnArrayLength]=undef;
    
        # assigning the  value of $j which is -1 as first index value of TableArray
        $TableArray[$i]= $j;
    
            # start to generate the TableArray which give out put as -1,0,0,1,2,0,0,1
            while ($i < $PtrnArrayLength){ 
                # check whether the adjecent characters of pattern
                # matching or not, if firsr condition and the adjecent 
                # two characters arenot match inner while loop is running
                while ($j >=0 && $PtrnArray[$i] ne $PtrnArray[$j]){
                    
                    # if inner loop running, assigne first index value of
                    # Tabale Array as -1
                    $j= $TableArray[$j];
                    }
                        # increment both $i,$j
                        $i++;
                        $j++;
                        # output gives as -1,0,0,1,2,0,0,1
                        $TableArray[$i]=$j;
                }
    
        # return the TabaleArray for the further manupulation with KMPalgoSearch subroutine
        return (@TableArray)
} 
# pass the argument, in my case I am passing $pattern in order to
# generate the TableArray i.e. prefixtable
PreprocessTable($pattern);


# defining the pattern matching subroutine 

sub KMPalgoSearch{
    # open thw sequence files which is in fasta format
    my $seqio_obj = Bio::SeqIO->new(-file => "C:\\Users\\dell\\Desktop\\first.fasta", -format => "fasta",-alphabet => "dna");

    # read one sequence at a time                                                                       
    while ($seq_obj = $seqio_obj->next_seq){   
        # print the sequence  ID,sequence description,sequence
        # this helps to upload all the sequences to Exel ot Access database 
           my $count=0; 
         my $text = $seq_obj->seq;
        my $len =length($text);    
     
        # initialize the two scalar variable $i, $j with 0
         my ($i, $j) =(0,0);
     
     # call the PreprocessTable subroutine and pass $pattern as its argument
     # and this is assign to the TableArray as return from PreprocessTable subroutine
     my (@TableArray)= PreprocessTable($pattern);
     
     # both pattern and text coming to this subroutine as string
     # now convert both pattern and text into array for the further manipulation
     # within this subroutine
     my @pattern=split //,$pattern;
     my @text = split // ,$text;
    
     # obtain and assigne the length/size of both pattern and text arrays
     my $ptrnLen = scalar @pattern;
     my $textLen = scalar @text;
     # this regular expression used to print the sequences that do not having pattern
     
     if( $text !~ m/TATAAAT/g && $count==0){
                         OUT_PUT -> print  ($seq_obj->display_id);
                                          
                }
     # start to match the pattern charactoers with text characters
     while ( $i < $textLen){
         
         while ( $j >= 0 && $text[$i] ne $pattern[$j]){
             
             # if first condition and the pattern and text characters are not match
             # have to refer the prefix table which is generated by first subroutine
             # since it has called within KMPalgoSearch subroutine now refering fisrt 
             # value of TableArray which is -1 and continue untill mach encount
             
             $j= $TableArray[$j];
         }
             $i++;
             $j++;
                     
                     # return the match position of text once the pattern length and $j equals to each other 
                     # $count helpls to get the perticular sequence only
             
                     if ($j==$ptrnLen && $count==0){
             
                     # here return the match position.I added +1 to get the actual position
                     # since ($i-$ptrnLen) return the index
                         OUT_PUT -> print  ( $seq_obj->display_id,";",$seq_obj->desc,";",($i-$ptrnLen+1));
                 
                         $count = $count+1;
                     } 
                     # if #count >0 print only location ,here I omit the douplicate printing of seq ID
                     elsif( $j==$ptrnLen && $count>0){
                         OUT_PUT -> print  (";",($i-$ptrnLen+1));
                                          
                }
                
                
             }
             # print a new line after the whlie loop before take second text string
             OUT_PUT -> print ("\n");
             
     }
    
     print "done","\n"    ;
}
# pass the arguments, here pass both $text and $pattern
KMPalgoSearch($pattern);

-------------------------------------------------------------------------------------

 

thank you

sequence gene • 1.9k views
ADD COMMENTlink modified 4.1 years ago by Alex Reynolds25k • written 4.1 years ago by ravihansa8260
1

Do you just not understand what the error messages are telling you?

This is probably more appropriate for stackoverflow or a perl forum.
 

ADD REPLYlink written 4.1 years ago by Devon Ryan84k

according to the warning message, it indicates that I have some uninitialized string at, "while ( $j >= 0 && $text[$i] ne $pattern[$j])" line...but ..i have no such uninitialized variables....this is the way I understood...I may wrong...can you suggest why this happen....?

 

ADD REPLYlink written 4.1 years ago by ravihansa8260
1

For what it's worth, I don't receive any error when I run that code, though I just used a very short input fasta file.

ADD REPLYlink written 4.1 years ago by Devon Ryan84k

thank you friend...but..i don't understand why I still having such a warning. I run the perl program in eclipse..did you run the program in linux?

ADD REPLYlink written 4.1 years ago by ravihansa8260
1

Yeah, I use Linux, so perhaps that's the reason (I really haven't a clue). I would strongly recommend you to post this on a Perl forum. Someone there is likely to be more helpful.

ADD REPLYlink written 4.1 years ago by Devon Ryan84k

thank you Devon.....

ADD REPLYlink written 4.1 years ago by ravihansa8260

HI Devon,

I found somthing..the first warning ,"Replacement list is longer than search list at C:/Perl/site/lib/Bio/Range.pm line 251." is due to the version variation. I did run the program in Linux with perl 5.14 instead perl 5.16 in my windows it did not give a warning

Similarly for the second warning,

Use of uninitialized value in string ne at C:/Users/dell/workspace/subroutine/sub.pl line 99, <GEN0> line 2.

simply overcome using ,

no warnings 'uninitialized';   

now my program is running without warnings..

anyway thank you very much for your support

 

ADD REPLYlink written 4.1 years ago by ravihansa8260

shouldn't you be storing the results of PreprocessTable() in some variable?

ADD REPLYlink written 4.1 years ago by russhh3.8k
Please log in to add an answer.

Help
Access

Use of this site constitutes acceptance of our User Agreement and Privacy Policy.
Powered by Biostar version 2.3.0
Traffic: 1013 users visited in the last hour