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,但两者都有相同的问题。
发布于 2022-03-23 07:23:58
要退出循环,您应该使用关键字last而不是exit (exit退出整个程序)。这个if
if(($gnd_net == 1) && /\}/) {
$gnd_net = 0;
$gnd_string .= "\} \n";
print "exiting loop $gnd_string \n";
exit;
}因此,应:
if(($gnd_net == 1) && /\}/) {
$gnd_net = 0;
$gnd_string .= "\} \n";
print "exiting loop $gnd_string \n";
last;
}(除非您真的想退出程序,否则打印应该是print "exiting program...")
以下是一些小窍门:
use strict和use warnings。它将捕捉到许多错误,并节省大量时间。open来打开文件(即,open FILEHANDLE,MODE,EXPR而不是open FILEHANDLE,EXPR)和词法文件句柄(例如,$FO而不是FO)。因此,您的打开应该是:open my $FO, '<', $opt_rh_gsr而不是open my $FO, '<', $opt_rh_gsropen之后添加|| 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) = @_;;它更地道,更简洁。--https://stackoverflow.com/questions/71582939
复制相似问题