2012-08-16 120 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