从文件中获取特定内容

时间:2012-08-16 18:43:05

标签: regex perl

我的格式有以下数据。

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

我知道它的多线模式的情况,我已经多次用Google搜索,但我无法得到它。 请帮我解决这个问题,因为我是新手,在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";
}

1 个答案:

答案 0 :(得分: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"],
}