继续而不是 Perl 中的“或死”
Posted
技术标签:
【中文标题】继续而不是 Perl 中的“或死”【英文标题】:Continue instead of 'or die' in Perl 【发布时间】:2020-10-04 21:58:00 【问题描述】:我的 Perl 脚本中有一个循环,用于准备和执行 SQL 语句,如下所示:
my $sql_1 = select * from TABLE;
my $sth_1 = $database->prepare($sql_1) or die "Failed to prepare SQL";
$sth_1->execute() or die "Failed to execute SQL";
my $results = sth_1-> fetchall_arrayref();
my params_ins;
my params_del;
foreach my $row($results)
params_ins = $row->params_ins
params_del = $row->params_del
my $sql_2 =
begin transaction
exec delete_sp(params_ins)
exec insert_sp(params_del)
end transaction
my $sth_2 = $database->prepare($sql_2) or die "Failed to prepare SQL";
$sth_2->execute();
据我了解, die 会导致代码的执行停止。是否可以继续下一个循环而不是停止脚本的整个执行?例如,是否可以执行以下操作:
my $sth_2 = $database->prepare($sql_2) or continue;
$sth_2->execute();
“或下一个”会起作用吗?
【问题讨论】:
请向我们展示实现循环的部分代码。 ~~~ my $sql_1 = select * from TABLE;我的 $sth_1 = $database->prepare($sql_1) 或死“无法准备 SQL”; $sth_1->execute() or die "Failed to execute SQL";我的 $results = sth_1-> fetchall_arrayref();我的 params_ins;我的 params_del; foreach my $row($results) params_ins = $row->params_ins params_del = $row->params_del my $sql_2 = begin transaction exec delete_sp(params_ins) exec insert_sp(params_del) end transaction my $sth_2 = $ database->prepare($sql_2) or die "Failed to prepare SQL"; $sth_2->执行(); ~~~ 请使用edit button将信息直接放在您的问题中。 @GMB 我刚刚注意到这个小小的编辑按钮哈哈。编辑了我原来的帖子。如果可以,请提供帮助。 【参考方案1】:您可以尝试next
功能。 https://perldoc.perl.org/functions/next.html
【讨论】:
你的意思是我可以用 or next 代替或者死掉?【参考方案2】:您可以将die
替换为warn
。 die
输出错误信息并退出脚本; warn
输出错误信息并且不退出脚本。
my $sth = $database->prepare($sql) or warn "Failed to prepare SQL";
$sth->execute() or warn "Failed to execute SQL";
【讨论】:
如果准备失败将终止程序(用于在未定义的值上调用->execute
)。【参考方案3】:
C 的等价物有 continue
在 Perl 中称为 next
。
my $sth_2 = $database->prepare($sql_2)
or do
warn("Failed to prepare SQL");
next;
;
【讨论】:
【参考方案4】:只是在这里添加一个额外的解决方案,您可以使用 try-catch 块(在 perl 中称为 eval)。
eval
my $sth_2 = $database->prepare($sql_2) or die "Failed to prepare SQL $DBI::errstr";
$sth_2->execute();
;
if($@)
warn "Error executing $sql2 => $@";
next;
【讨论】:
以上是关于继续而不是 Perl 中的“或死”的主要内容,如果未能解决你的问题,请参考以下文章
想要在 PHP 中传递值列表(如在 Perl 中),而不是引用数组