我正在做一个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
答案 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:
$/