in reply to Reading two files, cmp certain cols

You created a hash %file1, but then didn't use it as a hash

# foreach my $key (sort keys %file1){ # foreach my $position1 (@{$file1{$key}}){ # if ($current_line[0] eq $key) { if (exists $file1{current_line[0]} ) { $key= $current_line[0]; foreach my $position1 (@{$file1{$key}}){

Both versions above should be equivalent (except for the sorting of the keys), but the second version removes a loop.

The conditions don't contribute much to the runtime, no need to optimize them

Replies are listed 'Best First'.
Re^2: Reading two files, cmp certain cols
by sesemin (Beadle) on Sep 19, 2008 at 02:27 UTC
    Thanks Jethro,

    I may ask more questions form our Monks as I am trying to complete this script.

    It ran very quick. You are right; the loops had nothing to do with the run time. A+++

      Hi Jethro,

      If I want to add a simple counter to count the number of lines in the output (print statement) do you know what it correct way. I pushed one of the variables into an array and counted used the scalar as a counter. But I think there should be a better way.

      while(<INPUT2>){ chomp; my @current_line = split /\t/; push (@{$file2{$current_line[1]}}, $current_line[2]); if (exists $file1{$current_line[1]} ) { my $key = $current_line[1]; foreach my $position1 (@{$file1{$key}}){ if ($current_line[1] eq $key) { if ($current_line[2] == $position1) { if ($current_line[5] ==1) { if ($current_line[14] >= 3){ print RESULTS join ("\t", $current_line[1],$current_lin +e[2],$current_line[5],$current_line[14], "***",$key, $position1), "\n +"; push (@true_positives, $current_line[1]); } } } } } } }

        Counting needs two steps: Setting the counter to 0 before the loop and the incrementing step:

        #Initialize the counter before the loop my $true_positives=0; while(<INPUT2>){ ... #instead of the push $true_positives++;

        That's it, $true_positives has the number of positive results after the loop

      I think the problem lies in the 2 loops you have set up Pedro.

      foreach my $position1 (@{$file1{$key}}){

      This array holds the position +/- 8 that you read from the first file. Then, further down in your code, you are also adding plus/minus 8 postions from the position you read from the second file.

      foreach my $pos (@range){

      So I believe that is why you are getting the redundant printout.

      Chris