1

我正在尝试将两个值粘贴到一个字符串中。一个值是数组元素,另一个是 hashmapvalue。但我一直有这个错误:

Use of uninitialized value in concatenation (.) or string
  at makeNewCSV.pl line 104, <$fh> line 2020.

这是我的代码:

use feature qq(say);

my @nodeIdArray;
my @sequenceArray;
my @completeLineArray;

my %fastaHash = ();

[...]

sub readCsv{#Reads the CSV and puts all the Node ID's in an array

my ($file) = @_;
my $nodeID = qr{\d+\,(\d+)};

open(my $fh, '<', $file) or die "Error while reading CSV: $!";

    while(my $line = <$fh>){

        if($line =~ $nodeID){

            push(@nodeIdArray, $1);
        }
    }

close($fh);

searchFasta();
}


sub searchFasta{#Reads and searches the fasta file for contigs with a matching node ID

my ($file) = $ARGV[1];
my $fastaNodeID = qr{>NODE_(\d+)_LENGTH_\d+_COV_[\d.]+\n([ACTGN\n]+)};
my @matches;


open(my $fh, '<', $file) or die "Error while reading fasta: $!";

    my @allLines = <$fh>;

    my $makeString = join('', @allLines);
    my $lineAsString = uc($makeString);

    while($lineAsString =~ m/$fastaNodeID/g){

        my $node_ID = $1;
        my $sequence = $2;

        $sequence =~ s/\n//;

        $fastaHash{$node_ID} = $sequence;
    }

close($fh);


pasteLines();
}

sub pasteLines{

my $fullLine = "";
my $file = $ARGV[0];
my @hashKeys = keys(%fastaHash);
my $index = 0;
my $numberOfRepeat = 0;

open(my $fh, '<', $file) or die "Error while reading CSV (2): $!";


    my @allLines = <$fh>;
    my $arrayLength = @allLines;

    foreach my $line(@allLines){

        chomp($line);
    }

    while($numberOfRepeat <= $arrayLength){     

        foreach my $key(@hashKeys){

            if($key = $nodeIdArray[$index]){


                no warnings qw(uninitialized);  #DEBUG:
                say qq(DEBUG: \$fastaHash{$key} = "$fastaHash{$key}");
                say qq(DEBUG: \$fullLine = $allLines[$index] . "," . $fastaHash{$key};);
                use warnings qw(uninitialized);  #DEBUG:


                $fullLine = $allLines[$index] . "," . $fastaHash{$key}; #This line here gives the problems
                push(@completeLineArray, $fullLine);

                $index++;
            }

            else{

                $index++;
            }
        }
    }

close($fh);


}

$index 用于循环遍历数组,@allLines 包含读取文件中的所有行。(<$fh>是我的文件句柄)。

编辑 22-10-2012:我添加了整个代码以显示变量的生成位置

4

1 回答 1

1

通常,Perl 非常擅长在未定义的问题中选择准确的行号。

显然,在某个地方,你认为有价值的东西没有。解决此问题的最简单方法是在执行任何其他操作之前简单地打印出值。尝试这个:

use feature qq(say);

[...]

no warnings qw(uninitialized);  #DEBUG:
say qq(DEBUG: \$fastaHash{$key} = "$fastaHash{$key}");
say qq(DEBUG: \$fullLine = $allLines[$index] . "," . $fastaHash{$key};);
use warnings qw(uninitialized);  #DEBUG:
$fullLine = $allLines[$index] . "," . $fastaHash{$key};
push(@completeLineArray, $fullLine);

这将打印出您尝试连接在一起的值$fullline,我认为这是错误的来源。push即使@completeLineArray是空的,它也会起作用,如果是$fullLine问题,那么无论如何这将是上面一行的问题。

这很简单。只需复制上面的行并用 和 包围say qq(DEBUG:));。对于额外的奖励积分,您可以在 just 前面加上反斜杠,$以确保您对此没有任何问题。

say命令从 5.10 开始可用,并且很好,因为我不必一直将\n这些东西放在最后,因为我剪切和粘贴而发生了很多事情。您必须使用功能编译指示才能获得它。

我怀疑这$key不是您%fastahash哈希中的有效密钥。说$fastahash{$key}什么时候$key在你的哈希中不存在将返回一个未定义的值。由于您没有发布太多其他内容,因此我不能说为什么$key会指向不存在的值。但是,我敢打赌,一旦您开始打印这些密钥,您就会很快找到问题所在。

no warnings qw(uninitialized)停止打印未初始化的警告。我知道某些值将在DEBUG:语句中未初始化。这就是我打印它们的原因。但是,在您的声明之前重新启用未初始化的警告,这样您仍然会收到该警告。您在输出中看到了这一点,您可以查找DEBUG:上面的语句以查看问题可能是什么。

找出问题后,您可以DEBUG:通过搜索和删除轻松删除行。

现在,一旦发现此错误,有两种处理方法:

忽略它

只需用no warnings qw(uninitialized);anduse warnings qw(initialized);语句包围代码即可。它既快速又简单,而且程序可能只是在做你想做的事。此外,我们都知道如果你忽略一个问题,它就会消失。

处理错误

如果我怀疑它$key没有指向数组中的有效键,那么您可以捕获该错误并进行处理。它可能只是没有将该值推送到您的@completeLineArray数组中,或者它可能是其他一些错误处理技术。下面,我检查两种可能性:$key它不指向 中的有效条目%fastaHash,或者$key确实指向您的有效条目%fastaHash,但该值未定义:

if ( defined $fastaHash{$key} ) {
    $fullLine = $allLines[$index] . "," . $fastaHash{$key};
    push(@completeLineArray, $fullLine);
}
elsif ( not exists $fashaHash{$key} ){  #Key could exist, but value be `undef`
   ...;   #What you want to do if value key points to is undefined.
}
else (
   ...;   #What you want to do if $key doesn't point to a key in your hash
}
于 2012-10-21T13:27:55.993 回答