## some lines
## cell (a) { area : 0.898; power: 0.867;
....(some parameters values)
}
pin(a1) { power: 0.767; (some more parameters specific to pins)
timing() {
## again some parameters value....
}
我的文件包含大约300个此类单元格,这些单元格位于文件之间。我想解析文件以及知道所有变量参数的内容,我尝试了下面的代码但没有用
while (defined($line=<$fh>)) {
if ($line =~ /cell \(\w+\) \{/../cell \(\w+\) \{/) {
print $result "$line \n";
}
}
我想得到{}里面的值,但是,不知道如何获取,因为我的代码中的括号内有括号。请帮忙。
感谢大家的帮助..我写了一个代码来考虑标量属性(忽略括号内的所有属性。)BUt我面临一个非常奇怪的问题。我在我的代码中遇到if($ line =〜/ cell(\ w /../ cell(\ w /))的问题。对于第一个文件,它检测到有单元格的行(字段并从那里开始,但是对于第二个文件,它从第一行开始。
open $result_file1, ">", "file1.txt";
open $result_file2, ">", "file2.txt";
open $fl1, $file1; open $fl2, $file2;
sub file_reader {
($fh, $indx) = @_;
$count = 0;
undef @temp; undef @pram;
while (defined($line=<$fh>)) {
if ($line =~ /cell \(\w/../cell \(\w/) {
if ($indx == "1") {print $result_file1 "$line\n";}
if ($indx == "2") {print $result_file2 "$line\n";}
if ($line =~ /cell \(\w/) {
@temp = split (' ', $line);}
if ($line =~ /\{/) {
$count += 1;}
if ($line =~ /\}/) {
$count = $count - 1; }
if (($line =~ /:/) and ($count == 1)) {
@pram = split (':', $line);
if ($indx == "1") {$file1{$temp[1]}{@pram[1]} = @pram[2];}
elsif ($indx == "2") { $file2{$temp[1]}{@pram[1]} = @pram[2];}
} }}
close $fh;}
file_reader($fl1, "1");
file_reader($fl2, "2");
file1的一段输出: 单元格(AND2X1){
cell_footprint : "AND2X1 ";
area : 7.3728 ;
cell_leakage_power : 3.837209e+04;
driver_waveform_rise : "preDrv";
driver_waveform_fall : "preDrv";
pg_pin (VDD) {
voltage_name : "VDD";
pg_type : "primary_power";
}
pg_pin (VSS) {
voltage_name : "VSS";
pg_type : "primary_ground";
}
.......
file2的一段输出:
/**********************************************************************
**** ****
**** The data contained in the file is created for educational ****
**** and training purposes only and are not recommended ****
**** for fabrication ****
**** ****
***********************************************************************
**** ****
为什么在第二个文件的条件下无法应用该范围?
答案 0 :(得分:1)
我必须猜测你的输入数据,因此对问题和目标不太确定 但无论如何,请尝试更改您的行
if ($line =~ /cell \(\w/../cell \(\w/) {
到
if ($line =~ /cell \(\w/.. $line =~/cell \(\w/) {
否则第二个正则表达式将与未初始化的&#34; $ _&#34;匹配。
我发现了这个use strict;
use warnings;
这是我最喜欢的工具之一 顺便说一句,你让我意识到范围算子的这种用法,我觉得很有趣。感谢。