0

次のコードを実行して、mysql データベースから ID のリストを抽出し、それらを配列に格納しています。コード内の別の場所でこの一連の手順を正確に実行していますが、この場所で何かおかしなことが起こり、Perl がハングアップして戻りません。コード内の他のすべての場所で、正常に動作します。このコードをそのまま実行すると問題なく動作しますが、push() 関数のコメントを外すとハングします。これはバグですか?

my $result = $db->query($sqlstring)
if ($result->numrows > 0) {
    my @list = ();
    while (my %row = $result->fetchhash) {
        my $studyid = $row{'study_id'} + 0;
        print "$studyid\n";
        WriteLog("Found study [" . $studyid . "]");
        #push(@list,$studyid); # uncomment this to hang it
    }
    return \@list;
}

編集: data::dumper を試しました。しかし今、凍結は新しい場所で発生します。以下のコードでは、最後の Dumper(@list) ステートメントの直後にフリーズします。(MySQL モジュールから DBI にも切り替えましたが、効果はありませんでした)。

my @list = ();
my $result = $dbh->prepare($sqlstring);
$result->execute();
WriteLog($sqlstring);
if ($result->rows > 0) {
    while (my $row = $result->fetchrow_hashref()) {
        my $studyid = $row->{study_id};
        WriteLog("Found study [" . $studyid . "]");
        push @list,$studyid;
    }

}

print Dumper(@list);

return \@list;
4

2 に答える 2

1
  • この凍結はいつですか?pushへの最初の呼び出しまたは後続の呼び出しでフリーズしていますか?
  • 自分が押していると思っているものを押していると確信していますか?

あなたがすべきことは、 の前にuse Data::Dumper;a を実行することです。dumperpush

use Data::Dumper;
use feature qw(say);

my $result = $db->query($sqlstring)
if ( $result->numrows > 0 ) {
    my @list;
    while ( my %row = $result->fetchhash ) {
        my $studyid = $row{study_id} + 0;
        say $studyid;
        WriteLog("Found study [" . $studyid . "]");
        say "List: " . Dumper @list;
        say "Study ID: " . Dumper \$studyid;
        push @list, $studyid;     # uncomment this to hang it
    }
    return \@list;
}

sayの代わりに使用していることに注意してくださいprintDumper括弧に入れて使用しないと、問題が発生する可能性がありますprint。を使用したくない場合はsay、次のようにする必要があります。

print "Study ID: " . Dumper ( \$studyid ) . "\n";

ところで、行がない場合は何を返しますか?

于 2013-05-20T20:50:24.243 に答える
0

スクリプトの 1 つでこれと同じ問題が発生したことを言及しようとしました。スクリプトは Jenkins を介して実行されており、問題は実際には問題がなかったことです。プログラムの現在の状態の時点まで、すべての出力を確認していませんでした。そのため、プッシュでハングしたように見えましたが、実際には数行後の sleep() 呼び出しで合法的にハングしていました。David W.が言及した自動フラッシュフラグで修正されました。Jenkins を実行環境として使用すると (コマンドライン デバッガーと比較して)、問題が悪化しました。Jenkins コンテキストで開かれた STDOUT/STDIN パイプは、コマンドライン シェルには存在しません。そのため、コマンド ラインから問題が発生することはありませんでした。さらに混乱しました。

于 2014-02-20T16:02:29.940 に答える