【问题标题】:Continue instead of 'or die' in Perl继续而不是 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 我刚刚注意到这个小小的编辑按钮哈哈。编辑了我原来的帖子。如果可以,请提供帮助。

标签: loops perl syntax continue die


【解决方案1】:

您可以尝试next 功能。 https://perldoc.perl.org/functions/next.html

【讨论】:

  • 你的意思是我可以用 or next 代替或者死掉?
【解决方案2】:

您可以将die 替换为warndie 输出错误信息并退出脚本; 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 2014-03-13
      • 2013-07-07
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      相关资源
      最近更新 更多