首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在perl中打印while循环后的输出

无法在perl中打印while循环后的输出
EN

Stack Overflow用户
提问于 2022-03-23 06:55:16
回答 1查看 70关注 0票数 1
代码语言:javascript
复制
BEGIN {
   use FindBin;
   $scriptsDir = $FindBin::RealBin;
}

 sub print_log {
  ($log, $msg) = ($_[0], $_[1]);
  print $log $msg;
     }


$opt_rh_gsr = "path_to_file";
open(FO, "$opt_rh_gsr") || die "-F-: Can not open file \n";
while(<FO>) {
  if(/vdd_nets/) {
          $vdd_net = 1;
          $vdd_string = "VDD_NETS \{ \n";
               }
  if(/gnd_nets/) {
          $gnd_net = 1;
 }
     if(($gnd_net == 1)) {
     chomp();
     $new_line = $_;
     @split_new_line = split(":", $new_line);
     }
   if(($gnd_net == 1) && /\}/) {
      $gnd_net = 0;
      $gnd_string .= "\} \n";
      exit;
       }
  if($vdd_net) {
    if(/^\s*\S+\s+\S+\s+{/) {
      $paren++;
    }
    if (0 != $paren && /^\s*(\w+)\s*$/) {
     $vdd_nets{$1} = $parenvolt;
      next;
    }
    if(/^\s*}\s*$/ || /^\s+$/) {
      if (0 == $paren) {
        $vdd_net = 0; next;
      }
      else {
        $paren--;  next;
      }
    }
    chomp();
    if(/\s*\}\s*$/ && ($vdd_net == 1)){
    s/\'//g;
    $vdd_net = 0;
    @_ = split(":");
    $vdd_string .= "$_[0]  $_[1] \n";
    $vdd_string .=  "\} \n";
    next;
    }
      
  if($gnd_net) {
    if(/^\s*\}\s+$/ || /^\s+$/) {
      $gnd_net = 0;
      next;
    }
    #chomp();
    if(/\s*\}\s*$/ && ($gnd_net == 1)){
    s/\'//g;
    $gnd_net = 0;
    }
    @_ = split();
    $GNDNET = $_[0];
    if ($_[0] =~ /^\w+$/) {
      $groundnets{$_[0]} = 1;
     
    }
  }
}
}
print " done reading \n";
close(FO); 

print "closed file \n";

以上不是打印最后2个打印语句(在文件句柄关闭之前和之后)。我试过打印STDOUT,那不管用。我也试着冲水,这也没用。

脚本在执行后退出,因此它不会卡在任何地方的无限循环中。我尝试使用perl5.6和5.8,但两者都有相同的问题。

EN

回答 1

Stack Overflow用户

发布于 2022-03-23 07:23:58

要退出循环,您应该使用关键字last而不是exit (exit退出整个程序)。这个if

代码语言:javascript
复制
if(($gnd_net == 1) && /\}/) {
    $gnd_net = 0;
    $gnd_string .= "\} \n";
    print "exiting loop $gnd_string \n";
    exit;
}

因此,应:

代码语言:javascript
复制
if(($gnd_net == 1) && /\}/) {
    $gnd_net = 0;
    $gnd_string .= "\} \n";
    print "exiting loop $gnd_string \n";
    last;
}

(除非您真的想退出程序,否则打印应该是print "exiting program...")

以下是一些小窍门:

  • 总是在脚本的开头添加use strictuse warnings。它将捕捉到许多错误,并节省大量时间。

  • 使用3-操作数open来打开文件(即,open FILEHANDLE,MODE,EXPR而不是open FILEHANDLE,EXPR)和词法文件句柄(例如,$FO而不是FO)。因此,您的打开应该是:open my $FO, '<', $opt_rh_gsr而不是open my $FO, '<', $opt_rh_gsr

  • open之后添加|| die "-F-: Can not open file \n"是个好主意,但是您应该做or die而不是|| die (在这种特殊情况下,这并不重要,但是对于or而不是||,您可以省略open参数的括号),并且应该添加您试图打开的文件的名称(在这种情况下,您可以打印die "-F-: Can not open file '$opt_rh_gsr')。3)将$!添加到die中,以获得错误消息(die "-F-: Can not open file '$opt_rh_gsr': $!)。4)按照TLP的建议,不要在die字符串的末尾添加换行符.

  • sub print_log { ($log, $msg) = ($_[0], $_[1]); ...本可以是sub print_log { ($log, $msg) = @_;;它更地道,更简洁。--

  • 正确地缩进您的代码。可能缩进是在复制粘贴中丢失的,但是,如果不是这样,那么您应该更好地缩进代码。这将为您在编写/读取代码时节省大量时间,并将为其他人在阅读您的代码时节省更多的时间。大多数IDE都有缩进特性,可以帮助您缩进代码。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71582939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档