2012-11-05 72 views
1

我試圖在記錄的多線配置文件讀入一個Perl哈希陣列Perl的 - 從配置文件中的多行記錄讀取

示例配置文件:

record_1 
     phone=5551212 
     data=1234234 
    end_record_1 

    record_2 
     people_1=bob 
     people_2=jim 
     data=1234 
    end_record_2 

    record_3 
    people_1=sue 
    end_record_3 

這裏的我在尋找什麼:

$myData{1}{"phone"} <--- 5551212 
$myData{1}{"data"} <--- 1234234 

$myData{2}{"people_1"} <--- bob 
... etc 

什麼是最好的閱讀方式?模塊?正則表達式與多行匹配?蠻力?我站在下一步的領先地位。

+1

你爲什麼不顯示你的嘗試,我們可以對此有何評論?否則,就像爲你做功課一樣(不管這是否是家庭作業)。 – atk

+0

這是一個非常奇怪的配置文件格式。 perl模塊[Config :: Any](http://search.cpan.org/dist/Config-Any/)支持很多格式,我建議你遊說輸出你正在處理的格式的任何人以使用現有標準之一。 –

回答

7

這裏有一個選項與您的數據集:

use strict; 
use warnings; 
use Data::Dumper; 

my %hash; 
{ 
    local $/ = ''; 
    while (<DATA>) { 
     my ($rec) = /record_(\d+)/; 
     $hash{$rec}{$1} = $2 while /(\S+)=(.+)/g; 
    } 
} 

print Dumper \%hash; 

__DATA__ 
record_1 
    phone=5551212 
    data=1234234 
end_record_1 

record_2 
    people_1=bob 
    people_2=jim 
    data=1234 
end_record_2 

record_3 
    people_1=sue 
end_record_3 

輸出:

$VAR1 = { 
      '1' => { 
        'data' => '1234234', 
        'phone' => '5551212' 
       }, 
      '3' => { 
        'people_1' => 'sue' 
       }, 
      '2' => { 
        'people_1' => 'bob', 
        'data' => '1234', 
        'people_2' => 'jim' 
       } 
     }; 

在一個空行設置local $/ = ''結果被視爲在您的數據集「記錄分隔符」,所以我們可以在這些記錄上使用正則表達式來獲取哈希鍵/值的信息。

希望這會有所幫助!

+1

很好地完成。我寫了類似的東西,並沒有想到使用'while /(\ S +)=(。+)/ g'。 – Nate

+0

@Nate - 謝謝! – Kenosis

0

一次只讀一行。

當你看到一個新的記錄,添加新的空關聯數組myData搶對它的引用 - 這將是你的「當前記錄」。

現在,當你看到一個線路鍵/值對,您可以添加到當前的記錄陣列(如果有的話)

當你看到一個記錄的結尾,你只要清除參考目前的紀錄。

1

這裏有很多模塊,所以最好的做法是(像往常一樣)使用它們而不是重新發明輪子。

從您發佈的配置文件的片段看起來,它看起來像Config::Simple可能是最佳選擇。如果你可以簡化配置格式,那麼Config::Tiny會更容易使用。如果事情變得更加複雜,那麼您可能需要使用Config::General

http://metacpan.org/pod/Config::Tiny

http://metacpan.org/pod/Config::Simple

http://metacpan.org/pod/Config::General