如何从perl中的文件中提取一些特定信息?

时间:2015-12-02 11:43:35

标签: perl

## 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                                              ****

****                                                               ****

***********************************************************************

****                                                               ****

为什么在第二个文件的条件下无法应用该范围?

1 个答案:

答案 0 :(得分:1)

我必须猜测你的输入数据,因此对问题和目标不太确定 但无论如何,请尝试更改您的行

if ($line =~ /cell \(\w/../cell \(\w/) {

if ($line =~ /cell \(\w/..  $line =~/cell \(\w/) {

否则第二个正则表达式将与未初始化的&#34; $ _&#34;匹配。

我发现了这个
use strict;
use warnings;

这是我最喜欢的工具之一 顺便说一句,你让我意识到范围算子的这种用法,我觉得很有趣。感谢。