在匹配Perl中的特定行之后如何解析或打印数据?

时间:2014-04-20 08:34:25

标签: perl

我的数据文件如下

      extern const
      extern const

     /*****************************************************************************
      *                Data                                         *
      *****************************************************************************/
     #ifdef SELECTED
     /*****************************************************************************
      *                  comments                                         *
      *****************************************************************************/

      int test_data1_value;
      int test_data2_value;
      int test_data3_value;
      int test_data4_value;


     #endif
      random data
      random data

    /**********************************************************************
    *                       definitions                     *
    **********************************************************************/
    #define
    #define

我需要提取以“uint8”开头的数据行到注释“test data buffer”和“receive signal definations”
怎么可以这样做我写了一个像

这样的脚本
   while (<DATA>) {
   chomp;
   if (/^\*\s* Data / ... /^\*\s*definitions/) {
    if (m/^\s*int/) {
       print "$_";

         }
      }
     }

我需要将其视为

      int test_data1_value;
      int test_data2_value;
      int test_data3_value;
      int test_data4_value;

匹配特定注释字符串后,应检查以int开头的行并打印整行。如果行的开头没有int,则应该排除该特定行。但是这段代码对我不起作用

1 个答案:

答案 0 :(得分:2)

我不知道你想对#ifdef#endif之间的数据做些什么,但看起来如何过滤这些数据是你的主要问题,所以这里是如何通过使用operator ...,可用于指示行范围,正是我们所需要的:

#!/usr/bin/perl

use strict;
use warnings;

while (<DATA>) {
    chomp;
    if (/^\s*\*\s*test Data Buffer/ ... /^\s*\*\s*Receive signal definitions/) {
        if (m/^\s*uint8/) {
            print "$_\n";
        }
    }
}

__DATA__
      random data

     #ifdef CAN_CH0_SELECTED
     /*****************************************************************************
      *                  test Data Buffer                                         *
      *****************************************************************************/
      uint8 test_data1_value;
      uint8 test_data2_value;
      uint8 test_data3_value;
      uint8 test_data4_value;


     #endif
      random data
      random data

     /*****************************************************************************
      *                  test Data Buffer                                         *
      *****************************************************************************/