perl 错误:对基因数据进行质量控制时,模式匹配(m//)中使用了未初始化的值$_

nc1teljy  于 2023-10-24  发布在  Perl
关注(0)|答案(2)|浏览(199)

我希望你能帮助我解决一个有问题的脚本,我正在运行一个基因分析数据集,作为一些质量控制检查的一部分。
当我运行脚本时,这是一个Perl脚本(在Windows中运行),我得到以下错误:
Use of uninitialized value $_ in pattern match (m//) at /IC/ic.pl line 803, <$z> line 1.
查看ic.pl文件,似乎生成错误的第803行是下面这行:

if (/^##/)

在脚本的以下部分中:

my $header = <$z>;
if ($header =~ /^#.*/) {
    my $loop = 1;
    while ($loop) {
        if (/^##/) {  }
        else {
            $header = <$z>;
            $loop = 0;
        }
    }
}
chomp $header;

我不知道问题出在哪里。如果有人能解释一下潜在的原因,我将不胜感激。
我尝试通过Linux/Ubuntu的Windows子系统运行相同的脚本,收到相同的错误。

p8ekf7hl

p8ekf7hl1#

您的错误意味着$_变量未定义,它不包含值。通常情况下,这是因为文件句柄已耗尽,或从未打开,或文件为空。
在你的例子中,这可能是因为你试图发明自己的循环控制,它不检查eof(文件结束)。
通常,你永远不会遇到这个问题,因为使用这样的东西来读取文件是惯用的:

while (<$fd>) {
    ....
}

这个构造不会产生任何未定义的值,因为这将结束循环。
如果你想在到达eof之前结束循环,你可以使用last

while (<$fd>) {
    if (! /^##/ ) {
        $header = <$fd>;
        last;              # exit loop
    }
}
wn9m85ua

wn9m85ua2#

if (/^##/) {  }

的缩写

if ($_ =~ /^##/) {  }

但是你没有设置$_。这一行可能应该是

if ($header =~ /^##/) {  }

完整的固定代码:

my $header = <$z>;
if ($header =~ /^#.*/) {
    my $loop = 1;
    while ($loop) {
        if ($header =~ /^##/) {  }
        else {
            $header = <$z>;
            $loop = 0;
        }
    }
}

chomp $header;

但是仍然有一些问题。我认为你的意思是把$header = <$z>放在if语句的“then”部分。修复(并简化):

my $header = <$z>;
$header = <$z> while $header =~ /^##/;

chomp $header;

相关问题