0

我想写以下逻辑。如果整个循环成功(也就是说,如果作为循环对象的数组的每个元素都被转换),那么应该进行数据库操作(提交)。

我写了以下内容:

    if ($room->save ){ # this line i cant modify
    for ( @{ $room->members } ) {
     if ( $_->save ){      
       $room->ds->commit;                                                                                                                           
     } else {              
     return $c->render_ng_json("fail");
      }                     
   }

我的问题是,在我的代码中,每次$_->save成功,都会应用数据库操作,代价太高。如果有 12 个成员,并且每个成员都成功保存,则将有 12 次尝试提交。我希望 perl 分析整个循环是否没有错误(也就是说,如果每个成员都已保存),并且只有在这种情况下,才进行提交。这个逻辑怎么写?

4

3 回答 3

2

怎么样:

if ($room->save ){ # this line i cant modify
    for ( @{ $room->members } ) {
        return $c->render_ng_json("fail") unless $_->save ;
    }
    $room->ds->commit;                                                                                                                           
}

如果你想做部分提交:

if ($room->save ){ # this line i cant modify
    my $failed = 0;
    for ( @{ $room->members } ) {
        $failed = 1 unless $_->save ;
    }
    $room->ds->commit;                                                                                                                           
    return $c->render_ng_json("fail") if $failed ;
}
于 2013-09-09T07:19:14.173 回答
1

您可能需要以下逻辑:

for my $item (@items) {
  $item->stage or die "Some error";
}
$transaction->commit;
于 2013-09-09T07:18:10.183 回答
1

保留提交,直到您失败(如果这是您真正想要的,否则请删除下面的注释行)或直到所有保存完成:

if ( $room->save ) {
    for ( @{ $room->members } ) {
    if ( ! $_->save ) {
        $room->ds->commit;                 # possibly remove.
        return $c->render_ng_json("fail");
    }
    $room->ds->commit;
}
于 2013-09-09T07:20:02.617 回答