如何从特定行读到另一行 - Perl

时间:2015-07-01 05:19:00

标签: regex perl readline

我正在做一个Perl脚本,我有一个日志文件,我需要从中提取数据。我想知道如何从特定行读到另一行(不是文件末尾)。

我尝试了这种方式,如果它到达我想要停止的行但是它不起作用,就放一个last if。我想要开始阅读的行是<TEST_HEAD TH 1>,并在</TEST_HEAD TH 1>处停止。我这样做是因为我的正则表达式捕获了我不需要的数据,因此我尝试从特定行读取到另一行。

这是我到目前为止所做的:

while(<$log_fh>)
{
    if($. =~ /\<TEST_HEAD TH 1\>/)
    {
      if ( /Computer Name:\s*(\S+)(-\d+)/i )
      {
          $details{tester_name} = $1 . $2;
          $details{tester_type} = $1;
          push @{$details{tester_arr}}, $1 . $2;
      }
      elsif ( /Operating System:\s*(.*\S)/i )
      {
          $details{op_sys} = $1;
      }
      elsif ( /IG-XL Version:\s*([^;]*)/i )
      {
          $details{igxl_vn} = $1;
      }
      elsif ( /^([\d]+)\.\d\s+(\S+)\s+([\d-]*)\s+([\d|\w]*)(?=\s)/ )
      {
          push @{$details{slot}}, $1;
          push @{$details{board_name}},  $2;
          push @{$details{part_no}},  $3;
          push @{$details{serial_no}},  $4;
      }
      last if $. == /\<\/TEST_HEAD TH 1\>/;
    }
}

只是原始数据文件的修改样本:

<TEST_HEAD TH 1> #Start reading here

    (Lines containing data to be captured)

</TEST_HEAD TH 1> #end reading here

2 个答案:

答案 0 :(得分:2)

如果不想进入嵌套匹配逻辑,您可能需要更改

if($. =~ /\<TEST_HEAD TH 1\>/)

if (/<TEST_HEAD TH 1>/ .. /<\/TEST_HEAD TH 1>/)

你问的实际上是XY问题,最好用xml解析器处理xml文件。 Parsing complex XML in Perl

答案 1 :(得分:0)

如果不明确了解数据的外观,我还会提供另一种方法。

listItems.length设置为记录分隔符,然后一次抓取一块文本。然后,您可以同时应用一堆不同的正则表达式。

E.g:

$/