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;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的是print. Dumper如果您不将其括起来并使用print. 如果您不想使用say,那么您需要这样做:

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

顺便说一句,如果没有行,你会返回什么?

于 2013-05-20T20:50:24.243 回答
0

我要提到的是,我们的一个脚本也遇到了同样的问题。该脚本正在通过 Jenkins 运行,问题是没有真正的问题。我们只是没有看到程序当前状态的所有输出。所以它看起来像是挂在推送上 - 它实际上是在几行之后合法地挂在 sleep() 调用上。它是用 David W. 提到的自动刷新标志修复的。使用 Jenkins 作为执行环境(与命令行调试器相比)使问题更加严重。在 Jenkins 上下文中打开的 STDOUT/STDIN 管道不存在于命令行 shell 中。所以我们永远不会从命令行看到这个问题——这让我们更加困惑。

于 2014-02-20T16:02:29.940 回答