【发布时间】:2015-03-12 14:17:58
【问题描述】:
在嵌套的“while”循环中读取文件时遇到“使用未初始化的值”错误。我已将代码缩减到最低限度,并删除了文件名/目录以保护隐私:
#/usr/bin/perl -w
use strict;
use warnings;
use diagnostics;
my $line_gene = undef;
my $gene_name = undef;
my $gene_chr = undef;
my $gene_pos = undef;
my $line_pval = undef;
my $chr = undef;
my $pos_start = undef;
my $pos_end = undef;
my $pos_mid = undef;
my $pval = undef;
open(IN_GENE,"somefile_gene") || die "Failed, gene\n";
open(IN_PVAL,"somefile_pval") || die "Failed, pval\n";
while ($line_gene = <IN_GENE>) {
chomp $line_gene;
($gene_name,$gene_chr,$gene_pos) = split(/\t/,$line_gene);
while ($line_pval = <IN_PVAL>) {
chomp $line_pval;
($chr,$pos_start,$pos_end,undef,undef,$pval) = split(/\t/,$line_pval);
$pos_mid = ($pos_start + $pos_end)/2;
if ($gene_chr == $chr) {
print $gene_chr."\t".$chr."\n";
}
}
seek IN_PVAL, 0, 0;
}
exit;
当我运行此代码时,我收到以下错误消息:
Use of uninitialized value $gene_chr in numeric eq (==) at Xtest.pl line 36,
<IN_PVAL> line 5772 (#1)
然后遵循这些"Use of uninitialized value" 警告是打印到标准输入的正确行:
6 6
1 1
20 20
... ...
除非我明显做错了什么,否则我看不出它为什么认为$gene_chr 未初始化。有趣的是,对于输入文件<IN_PVAL> 的每一行,它都会从第 1 行到第 5772 行打印上述"Use of uninitialized value" 警告(见上面的警告),除了这个文件只有 2886 行,正好是 5772 的一半。
两个输入文件(<IN_GENE> 和 <IN_PVAL>)都没有空行,无论是在中间还是在末尾,并且都按照预期的格式使用正确数量的字段,其中没有一个是空的。
任何建议将不胜感激。谢谢!
【问题讨论】:
-
显示产生错误的两个文件的摘录。
-
@JESUISCHARLIE 在您建议查看文件(连同 Sebastian)后,我发现
<IN_PVAL>的 2886 行中有 3 行有多个空格分隔字段而不是制表符 - 替换这些似乎已经修复了问题!谢谢你:)
标签: perl file while-loop initialization