1

我有以下格式的数据。

##############################
# A_Data
##############################
A_Data += data1
data2
data3
data4

###############################
# B_Data
###############################
B_Data += data5
data6

###############################
# C_Data
###############################
C_Data += data7

我想单独提取数据,例如:

A_Data (e.g.Array)
data1
data2
data3
data4

对于 B_data 和 C_Data 也是如此,以便我可以单独显示它。使用我的脚本,我可以得到

A_Data += data1
data2
data3
data4

B_Data += data5
data6

C_Data += data7

我知道它的多线模式的情况,我用谷歌搜索了很多次,但我无法得到它。请帮我解决这个问题,因为我是新来在 perl 中使用正则表达式。

到目前为止我所尝试的:

我将文件数据放在一个数组中,然后尝试应用正则表达式

@array1;
for (my $i=0;$i < $length;$i++)
{
    $data[$i]=~ s/#.*//;
    #$data[$i]=~ /[A_Data](.*?)[B_Data]/;  ## trying to get data in between those two data.
    print $data[$i]."\n";
}
4

1 回答 1

2

解决方案取决于您的数据文件的精确格式,但这适用于您提供的示例

use strict;
use warnings;

open my $fh, '<', 'data_file.txt' or die $!;

my $tag;
my $data;

while (<$fh>) {
  chomp;
  s/#.*//;
  next unless /\S/;
  $tag = $1 if s/^(\w+)\s*\+=\s*//;
  push @{ $data->{$tag} }, $_ if $tag;
}

use Data::Dump;
dd $data;

输出

{
  A_Data => ["data1", "data2", "data3", "data4"],
  B_Data => ["data5", "data6"],
  C_Data => ["data7"],
}
于 2012-08-16T18:53:46.913 回答