我正在运行以下代码从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;
答案 0 :(得分:1)
push
或接听电话后会冻结吗?您应该做的是use Data::Dumper;
,然后在dumper
之前执行push
。
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";
顺便问一下,如果没有行,你会返回什么?
答案 1 :(得分:0)
我要提到的是,我们的一个脚本遇到了同样的问题。该脚本正在通过Jenkins运行,问题是没有真正的问题。我们刚刚没有看到所有的输出直到程序当前状态。所以它 看起来 就好像它被挂在了一个推 - 它实际上是在几行之后合法地挂在sleep()上。它是用David W.提到的自动冲洗标志修复的。使用Jenkins作为执行环境(与命令行调试器相比)使问题更加严重。在Jenkins上下文中打开的STDOUT / STDIN管道在命令行shell中不存在。因此,我们永远不会从命令行看到问题 - 进一步使我们感到困惑。一旦我意识到存在通信管道,那么事情就会到位。