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

Hello hello Thanks to the time you wasting with me
I tried both code but I do not have any output file at end
#!/usr/bin/perl -w use strict; my$line; my@fields; my@output; open (FILE1, 'snp2.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); my@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;
This one the most convincing to me, but I have no output file at the end...I do not know where the problem could be

Replies are listed 'Best First'.
Re^3: General program and related problems
by jethro (Monsignor) on Aug 04, 2009 at 23:39 UTC

    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

    Each run through the while loop you are overwriting the results of the previous loop. Solution: Add new results to @output instead of overwriting it, with push @output, grep ....

      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;