Perl:写“如果一个完整的循环成功完成然后做一些事情”

时间:2013-09-09 07:12:15

标签: perl

我想写下面的逻辑。如果整个循环成功(即,如果转换了循环对象的数组的每个元素),那么应该遵循数据库操作(提交)。

我写了以下内容:

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

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

3 个答案:

答案 0 :(得分: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 ;
}

答案 1 :(得分:1)

您可能需要沿着这些方向的逻辑:

for my $item (@items) {
  $item->stage or die "Some error";
}
$transaction->commit;

答案 2 :(得分:1)

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

if ( $room->save ) {
    for ( @{ $room->members } ) {
    if ( ! $_->save ) {
        $room->ds->commit;                 # possibly remove.
        return $c->render_ng_json("fail");
    }
    $room->ds->commit;
}