Perl在推入阵列时挂起

时间:2013-05-20 20:17:14

标签: perl

我正在运行以下代码从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;

2 个答案:

答案 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代替printDumper如果您没有将其括起来并使用print,则会导致问题。如果您不想使用say,那么您需要这样做:

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

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

答案 1 :(得分:0)

我要提到的是,我们的一个脚本遇到了同样的问题。该脚本正在通过Jenkins运行,问题是没有真正的问题。我们刚刚没有看到所有的输出直到程序当前状态。所以它 看起来 就好像它被挂在了一个推 - 它实际上是在几行之后合法地挂在sleep()上。它是用David W.提到的自动冲洗标志修复的。使用Jenkins作为执行环境(与命令行调试器相比)使问题更加严重。在Jenkins上下文中打开的STDOUT / STDIN管道在命令行shell中不存在。因此,我们永远不会从命令行看到问题 - 进一步使我们感到困惑。一旦我意识到存在通信管道,那么事情就会到位。