in reply to Re^2: General program and related problems
in thread General program and related problems

Did you see that your program is producing an error message? It should be 'close', not 'Close' at the end

Some words on debugging. If you don't know what your program does, insert print statements to find out (or use Data::Dumper).

For example a simple print @output; before the foreach loop would have told you that @output is empty.

Then you could have looked at the previous loop where @output should have been filled. A print join('|',@fields),"\n"; or even better print Dumper(\@fields); (you also need a line use Data::Dumper for this) and print Dumper(\@output); at the end of the loop would have given you surprising results. If you want to learn something, please do the above, look at the result and think about it. If you don't find the solution, read the spoiler below.

After you solved the first problem you will see that there is a further problem, you are getting only the result of the last line in file1. The ouput of the prints or Dumper lines should give you a clue again, if not read the next spoiler

Replies are listed 'Best First'.
Re^4: General program and related problems
by micky744monk (Novice) on Aug 05, 2009 at 21:44 UTC
    Thank you again for the time you are spending with me....I understood the other problems, whilst the push @array is not really a problem since even with this code printing the @output list I have all the rs from file 1. The code is still not working, but trying to run the code and checking the output I noticed that the first code had an empty hash. Now I tried to play a bit with hash definition (and what I did could be completely wrong) but now the array is giving me the file1 together with a number that could be the position, so I guess the code is treating the file like only one string....I do not know it should be something wrong on the first block and on the hash definition....if you could point me in the right direction, I could keep going on the debugging....
    #!/usr/bin/perl -w use strict; my$line; my@fields; my@output; my$position; my%rs; open (FILE1, 'snp.txt') or die "can't open the file: $!"; open (FILE2,'chr22.txt') or die "can't open the file: $!"; open (FD, '>test.txt') or die "can't open the file: $!"; while ($line=<FILE2>) { $line=~/^(rs\d{5,})\b/; $position = tell( FILE2 ); if (defined $line) { $rs{$line}= $position; } } print %rs; while (defined ($line= <FILE1>)) { my@fields= split (/\s+/ ,$line); @output=grep /^rs\d{5,}\b/ ,@fields; } foreach (@output) { if (exists $rs{$_}) { seek(FILE2,$rs{$_},0); my $line= <FILE2>; print FD $line; } } close FILE1; close FILE2; close FD;
    The output file is empty to be precise Cheers again!

      The push array is a problem. Insert print "<@output>\n" after the second while loop and you will see that @output is emtpy or nearly empty. Because it has only the result of the last line in it.

      I see you changed something in the first loop. Putting the whole line into %rs with  $rs{$line}= $position; is wrong. You have to store the rsxxx as key otherwise you won't find anything.

      Here is the code that is working, at least with my test data. Note that this is exactly your version from two days ago with 'Close' changed to 'close' and the line with the grep changed to use push and without the 'my'. If that isn't working for you it means I'm operating on different data than you

      #!/usr/bin/perl -w use strict; my$line; my@fields; my@output; open (FILE1, 'snp.txt') or die "can't open the file: $!"; open (FILE2,'chr22.txt') or die "can't open the file: $!"; open (FD, '>test.txt') or die "can't open the file: $!"; my $position = tell(FILE2); my %rs; while ($line=<FILE2>) { my ($key)= $line=~/^(rs\d{5,})\b/; if (defined $key) { $rs{$key}= $position; } $position=tell(FILE2); } while (defined ($line= <FILE1>)) { my@fields= split (/\s+/ ,$line); push @output, grep /^rs\d{5,}\b/ ,@fields; } foreach (@output) { if (exists $rs{$_}) { seek(FILE2,$rs{$_},0); my $line= <FILE2>; print FD $line; } } close FILE1; close FILE2; close FD;
        Hello For me @output was fine even without push, just sayin print @output before the foreach loop, I got all the rs from file1. Anyway that is not the problem. My output file is completely empty. This is the line of my data from file 2. Can you tell me how your data looks like? How did you build the test data ? Or I can just send you my data and see if your code is working on them. Cheers