2

2 つの MySQL テーブルを同期するために使用している次の手順があります。

sub sync{
    my %tables = (
        'sitematrix_test' => 'sitematrix_sites'
    );

    while(($key, $value) = each(%tables)){
        print "Matching columns $key : $value\n";

        my @data;
        my $query = $db->prepare("
            SELECT $key.* FROM $key LEFT JOIN $value ON 
            $key.site_id = $value.site_id WHERE $value.site_id IS NULL;
        ") 
            or die "Couldn't prepare statement: " . $db->errstr;

        $query->execute() 
            or die "Couldn't execute statement: " . $query->errstr;

        if($query->rows == 0){
            print "No updates have been made for $key : $value";
        }
        else{
            #read the matching records and print them out
            while(@data = $query->fetchrow_array()){
                print "@data\n";
            }
        }

        $query->finish;
    }

    $db->disconnect;    
}

次のエラーが発生します。

Use of uninitialized value $data[3] in join or string at C:/Users/souzamor/workspace/Parser/synchronizer.pl line 69.
Use of uninitialized value $data[4] in join or string at C:/Users/souzamor/workspace/Parser/synchronizer.pl line 69.
Use of uninitialized value $data[5] in join or string at C:/Users/souzamor/workspace/Parser/synchronizer.pl line 69.
Use of uninitialized value $data[6] in join or string at C:/Users/souzamor/workspace/Parser/synchronizer.pl line 69.

なぜ配列の境界を超えているのか、誰か説明してもらえますか?

4

1 に答える 1

5

NULLデータベースから取得したデータに s があります。undefこれらは Perlに変換されます。警告はこの行から来ています:

print "@data\n";

配列を文字列化する場所。例:

perl -Mwarnings -e '@foo=(1, 2, undef, 3); print "@foo\n"'
Use of uninitialized value $foo[2] in join or string at -e line 1.
1 2  3

本当に配列全体を文字列化して毎回出力したい場合、簡単な修正はundefs を空の文字列に変換することです:

while( my @data = map { defined($_) ? $_ : '' } $query->fetchrow_array() ) {

または、すべての行のすべてのデータを印刷する必要がない場合は、主キーまたはそうでないことがわかっているものを印刷するだけですNULL

于 2012-07-20T23:36:57.950 に答える