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

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!

Replies are listed 'Best First'.
Re^5: General program and related problems
by jethro (Monsignor) on Aug 06, 2009 at 00:24 UTC

    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

        my testdata was like this:

        snp.txt: ----------- rs34569384 rs123456 rs234567 rs753444 ---------- chr22.txt: --------- bla sijghs bla rs234567 yes,first one fdjg rs123456 yes, second one ---------