Nandita Mullapudi wrote:
> 
> Hi all,

Hello,

> am using the following script to parse a long list of files. funnily
> enough, it works fine when i try a couple sample files, but when i'm
> using a long list of files, it comes up with this error:
> 
> readline() on closed filehandle FILE at hashing22.pl line 29, <FILE> line
> 13 (#1)
>     (W closed) The filehandle you're reading from got itself closed
> sometime
>     before now.  Check your logic flow.
> 
> i dont know what could be causing this- any ideas?
> 
> here's the script:
> #!/usr/bin/perl-w
> # takes a file where the first line specifies query length, puts in ahash
> # the seqid and numbers listed, adds up the numbers, divides by qlen
> # and give len coverage.

use strict;

> use diagnostics;
> 
> $out_dir = "post_parsing_len_cov_files";
> mkdir $out_dir, 0777 unless (-e $out_dir);
> $| = 1;
> 
> $files= "./listofnames2";
> 
> open (FH,"$files") or die "cannot create list :$!";

The quotes and the parenthesis are not required.  You are not trying to
"create" the list, you are trying to read a list that has already been
created.

open FH, $files or die "cannot open $files:$!";

> while (<FH>) {
> 
>     push (@list, $_);
> }

You need to chomp the lines from the file to get the correct file names.

chomp( my @list = <FH> );

> foreach  (@list) {
> $filename=$_;

foreach my $filename ( @list ) {


>     open (FILE, $filename);

You should ALWAYS verify that the file opened correctly.

    open FILE, $filename or die "Cannot open $filename: $!";

>     open (HASH_OUT, ">$out_dir/$filename.stats");

    open HASH_OUT, ">$out_dir/$filename.stats"
        or die "Cannot open $out_dir/$filename.stats: $!";

>     my %hash;
> while (<FILE>)
> {
>     if (/^Query : (.*)\S/m){

You are reading a line at a time from <FILE> so you don't need the /m
option.  Are you sure you don't want the last non-whitespace included in
the capturing parenthesis?


>         $qname = "$1";

The quotes are not needed.

>         print HASH_OUT "Query : $qname\n";
>     }
> else
> {
> if (/^qlen = (\d+)/m){

The /m option is not needed.

>  $qlen = "$1";

The quotes are not needed.

>  print HASH_OUT "querylen = $qlen\n";
> }
> else
> {@line = split (/\n/);
>  foreach $line (@line){

You are processing the file a line at a time so there is no need for the
split() and foreach loop.

> ($key,$value) = split (/:/);
> $hash {$key} = $value;
> #print " $value";
> @nums = split (" ",$value);
> #print "$key: @nums";
> 
> $tot = &total(@nums);
> $cov = $tot/$qlen * 100 ;
> if ($cov >= 50){
>  print  HASH_OUT "$key : $cov\n";
> }}}
> }}}
> 
> close FILE;
> 
> sub total {
> my $sum;
>     foreach (@_){
>         $sum += $_;
>     }
>     $sum;
> }
> ------------------------------
> a typical file to be read by this script is would look like this:
> 
> Query : MAL13P1.227_ubiquitin-conjugatin
> qlen = 278
> 
> >CpType1H_3652:111 81
> >CpIowa_1214.266:111 121
> >CpGSS_AQ842837:98
> >CpType1H_3631:118
> >CpIowa_1214.272:118 74 26
> >CpIowa_1214.275:77 90 141 17 10 17
> >CpEST_AA390251:117
> >CpEST_AA390240:102
> >CpType1H_3267:77 143
> >CpGSS_AQ842682:98
> 
> ----------------------------------
> SOME files also don't have any lines in them after the first two.
> any suggestions on improving my long winded coding skills (or lack
> thereof) are most welcome.



#!/usr/bin/perl -w
# takes a file where the first line specifies query length, puts in
ahash
# the seqid and numbers listed, adds up the numbers, divides by qlen
# and give len coverage.

use strict;
use diagnostics;

my $out_dir = 'post_parsing_len_cov_files';
mkdir $out_dir, 0777 unless -e $out_dir;

my $files = 'listofnames2';
open FH, $files or die "Cannot open $files: $!";
chomp( @ARGV = <FH> );

my $qlen;
while ( <> ) {
    if ( $. == 1 ) {
        open HASH_OUT, '>', "$out_dir/$ARGV.stats"
            or die "Cannot open $out_dir/$ARGV.stats: $!";
        }
    next unless /\S/;
    if ( /^Query : (.*\S)/ ) {
        print HASH_OUT "Query : $1\n";
        }
    elsif ( /^qlen = (\d+)/ ) {
        $qlen = $1;
        print HASH_OUT "querylen = $qlen\n";
        }
    elsif ( /^(.+):(.+)/ ) {
        my $cov = total( split ' ', $2 ) / $qlen * 100;
        if ( $cov >= 50 ) {
            print HASH_OUT "$1 : $cov\n";
            }
        }
    }

__END__



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to