1

2 つの値を文字列に貼り付けようとしています。1 つの値は配列要素で、もう 1 つはハッシュマップ値です。しかし、私はこのエラーを抱え続けています:

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:)上記の行をコピーして、 andで囲み);ます。追加のボーナス ポイントとして、バックスラッシュを の前に置い$て、問題が発生しないようにすることができます。

このコマンドは 5.10 以降で使用できます。カット アンド ペーストを行うために頻繁に発生するこれらの処理の最後に をsay付け続ける必要がないため、このコマンドは便利です。これを取得するには、 featureプラグマ\nを使用する必要があります。

私の疑いでは、それ$keyはあなたの%fastahashハッシュの有効なキーではありません。$fastahash{$key}がハッシュに$key存在しないと言うと、未定義の値が返されます。他にあまり投稿しなかったので、なぜ$key存在しない値を指すのかわかりません。ただし、これらのキーを印刷し始めると、すぐに問題が見つかるはずです。

no warnings qw(uninitialized)、初期化されていないという警告の出力を停止します。ステートメントで一部の値が初期化されないことはわかっていますDEBUG:。それが私がそれらを印刷している理由です。ただし、ステートメントの前に初期化されていない警告を再度有効にして、その警告が引き続き表示されるようにします。DEBUG:出力にそれが表示され、上記のステートメントを探して、問題が何であるかを確認できます。

DEBUG:問題を見つけたら、検索と削除を使用して簡単に行を削除できます。

このエラーを見つけたら、次の 2 つの方法で処理できます。

それを無視します

no warnings qw(uninitialized);コードをanduse warnings qw(initialized);ステートメントで囲むだけです。それは迅速かつ簡単であり、プログラムはとにかくあなたが望むことをしているかもしれません. その上、問題を無視すれば、問題が解決することは誰もが知っています。

エラーを処理する

$key配列内の有効なキーを指していないと思われる場合は、そのエラーをキャッチして処理できます。単にその値を@completeLineArray配列にプッシュしていないか、他のエラー処理手法である可能性があります。以下で、2 つの可能性をチェックします。それ$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 に答える