错误:使用Perl读取已关闭文件句柄上的行

njthzxwz  于 2023-01-21  发布在  Perl
关注(0)|答案(1)|浏览(209)
!/usr/bin/perl
use Cwd;
use warnings;

open($fh,'<', "clinical.txt");
$line = <$fh>;

while($line = <$fh>)
{   
    
    my @fields2 =split(" ",$line);
    push(@id,$fields2[1]);

    push(@status,$fields2[3]);
    }
@flow = grep { -d } glob "*"; 
$arrSize = @flow;
for ($p = 0; $p < $arrSize; $p++)
{

    @files=<$flow[$p]/*.maf>;
    print $flow[$p],"\n";
    
    foreach $file(@files)
    {
        print $file,"\n";
        open(x,$file);
        %hash={};
        %tested={};
        %Mut_Count={};
        $hyper=0;
        $line = <x>;
        $line = <x>;
        $line = <x>;
        $line = <x>;
        $line = <x>;
        $line = <x>;
        while($line = <x>)
        {
            @temp=split("\t",$line);
            $key=$temp[4]."_".$temp[5]."_".$temp[6]."_".$temp[10]."_".$temp[11]."_".$temp[12]."_".$temp[15];
            push @{$hash{$key}}, "0";
            push @{$Mut_Count{$temp[15]}}, "0";
        }
        
        @nm=split(/\./,$file);
        open(x,$file);
        open(Out1,">Results/".$nm[1]."_Hyper.txt");
        $line = <x>;
        $line = <x>;
        $line = <x>;
        $line = <x>;
        $line = <x>;
        @temp=split(" ",$line);
        @temp2=split(",",$temp[1]);
        print Out1 "Gene\tMutation\tType\tdbSNP\tStatus\tPolyphen\tSift";
        for($j=0;$j<scalar(@id);$j++){
        my @M=split('-', $id[$j]);
        for($i=0;$i<scalar(@temp2);$i++)
        {
        my @N=split('-', $temp2[$i]);
            if(scalar(@{$Mut_Count{$temp2[$i]}})>499 && $M[0] eq $N[0] && $M[1] eq $N[1] && $M[2] eq $N[2] && $status[$j] eq 'MSS')
            {
                print Out1 "\t",$temp2[$i];
                $hyper++;
            }
        }
}
        $line = <x>;
        while($line = <x>)
        {
            $hy=0;
            @temp=split("\t",$line);
            $key=$temp[4]."_".$temp[5]."_".$temp[6]."_".$temp[10]."_".$temp[11]."_".$temp[12];
            if(!exists $tested{$key})
            {
                push @{$tested{$key}}, "0";
                print Out1 "\n",$temp[0],"\t",$key,"\t",$temp[8],"\t",$temp[13],"\t",$temp[25],"\t",$temp[72],"\t",$temp[73];
                
        for($i=0;$i<scalar(@temp2);$i++)
        {

                
                    $key=$temp[4]."_".$temp[5]."_".$temp[6]."_".$temp[10]."_".$temp[11]."_".$temp[12]."_".$temp2[$i];
                    
                    my @L=split('-', $temp2[$i]);
                    for($j=0;$j<scalar(@id);$j++){
        my @O=split('-', $id[$j]);
                    if(scalar(@{$Mut_Count{$temp2[$i]}})>499 && $L[0] eq $O[0] && $L[1] eq $O[1] && $L[2] eq $O[2] && $status[$j] eq 'MSS')
                    {
                        if(exists $hash{$key})
                        {
                            print Out1 "\t1";
                            $hy++;
                        }
                        else
                        {
                            print Out1 "\t0";
                        }
                    }
                    }
                }
                
                
            }
        }
        open(Out3,">Results/".$nm[1]."_Summary.txt");
        print Out3 "Hypermutated\t$hyper\n";
    }
}

$line = <$fh>; while($line = <$fh>)这些行在已关闭的文件句柄$fh上显示readline()
%hash={}; %tested={}; %Mut_Count={};在这三行中表示Reference在需要偶数大小列表的位置找到
.maf基本上是GDC下载的文件,根据我们的需要对标头进行了位修改,并具有唯一的TCGA ID。而临床信息是包含TCGA ID、其来源和MSI_Status的文件,MSI_Status告诉我们其是否为MSI-L,MSI-H或MSS。我正在阅读多个.maf文件并将其与clinical_info文件进行比较,如果满足if条件,我希望它生成主表(写一个文件)我在windows下做的。请帮我解决这个问题,谢谢期待。

nfs0ujit

nfs0ujit1#

答复

%hash={}; %tested={}; %Mut_Count={}; on these three lines it says Reference found where even-sized list expected

您可以通过删除这三行来消 debugging 误,但是如果您接受(请!)use strict;建议,则需要将它们替换为my %hash;,依此类推。
在Perl下,散列(和数组)不需要初始化。如果你想初始化一个,你可以给它分配另一个数组,或者列表,或者另一个散列。初始化器的长度必须是偶数,因为它被解释为键/值对。你的代码提供了一个散列引用,它不会被Perl扩展为一个空散列。因此出现了这个错误。
如果不初始化散列会让您感到紧张,可以使用my %hash = ();
另一方面,如果你打算使用标量作为哈希引用,你需要初始化它。这就是你使用花括号的地方,花括号是一个哈希构造函数,它返回一个对所构造哈希的引用。所以:

my $hash = {};
$hash->{$key} = $value;
...

相关问题