【发布时间】:2016-05-20 16:07:03
【问题描述】:
我有一个输入源如下。我想要做的是将每条Layer 行上的数值捕获到一个数组中,然后打印出最大值。
输入
MACRO cell_1
size 0.1 by 0.1 ;
pin a
(....same topology as pin vcc)
END a
pin b
(.....same topology as pin vcc)
END b
Pin vcc
aaaa
bbbb
Port
Layer m2 ;
END
CCC
DDD
Port
Layer m1 ;
END
EEE
FFF
Port
Layer m0 ;
END
END vcc
pin d
(....same topology as pin vcc)
END d
END cell_1
MACRO cell_2
(repeated)
END cell_2
我的代码:
foreach my $file ( @files ) { # @files = multiple path of abc/def/fgh/cell_lef
open( INFILE, "<$file" ) || die "Can not open stdcell_file\n";
my @lines = <INFILE>;
close INFILE;
$init = 1;
$delimiter =~ /^$/; # between each MACRO. haven't utilize this yet
foreach (@lines) {
if ( $init ) {
$path = 1;
$init = 0;
@num = ();
}
if ( $path ) {
if ( /MACRO\s+(\S+) /) {
$cellname = $1; print "$cellname\n";
}
if ( /SIZE\s+(\S+)\s+(\S+)\s+(\S+)/ ) {
$footprint_x = $1;
$footprint_y = $3;
print "$footprint_x $footprint_y\n";
}
if ( /PIN vcc/ .. /END vcc/ ) {
#grab the highest value from layer (m*)
#print "max layer = m*"
}
$init = 1;
}
}
}
预期输出
cell_1
0.1 0.1
m2
cell_2
0.2 0.2
m3
我尝试使用的代码:
if ( /PIN vcc/../END vcc/ ) {
if ( /LAYER\s+m(\S+) / ) {
push(@num, $1);
print "@num";
}
}
到目前为止,我的代码的问题是,当我打印 @num 的值时,所有值都作为字符串 (210) 而不是单个元素连接在一起:2 1 0 — 所以我无法进行排序以获得最大值。
更新:我不确定如何将 while 集成到我的代码中,因为我使用 foreach 作为我的主循环
【问题讨论】:
-
嵌套的 if 语句有点尴尬,但这应该可以。格式 -
print join " ", @num;可能会有所帮助 - 不应该影响排序(您没有显示)。 -
在你的输出中,“0.2 0.2”这一行是从哪里来的?
-
@marty ,它不会反映在输入源中。它只是一个随机数来说明我的预期输出是什么样的
-
您的
print "@num"是问题所在。这就是 Perl 打印数组的方式。进入调试模式并执行此操作以查看@num 数组:x @num。它会为每个数组项打印一行。
标签: perl