2012-08-16 139 views
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 

我知道的多行模式的情况下,我用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

显示您的代码。 – daxim 2012-08-16 18:52:01

+1

我不确定我会为此使用多行正则表达式。一个表达式来解析出各条线本身。但我会手动进行状态转换。 – 2012-08-16 18:55:07

+0

这是不明显的,你已经尝试过或你需要帮助。请编辑你的问题。 – tripleee 2012-08-16 18:56:28

回答

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"], 
} 
+0

只是要清楚,这是迈克尔威尔逊在评论中提出的手动状态转换解决方案的类型。 – DVK 2012-08-16 19:00:58

+0

我得到错误 无法在未指定的参考上调用方法“dd” – iDev 2012-08-16 19:28:37

+0

'use Data :: Dump'和'dd'行用于诊断,它们可以被删除或替换。 – 2012-08-16 21:14:38