大多數文本處理 - 包括處理反斜槓延續線 - 在Perl中非常簡單。所有你需要的是一個像這樣的讀取循環。
while (<>) {
$_ .= <> while s/\\\n// and not eof;
}
下面的程序做我認爲你想要的。我在讀循環中放入了一個print
調用,以顯示已經通過連續行聚合的完整記錄。我還演示瞭解壓縮b1
字段,並以Data::Dump
顯示輸出,以便您可以看到所創建的數據結構。
use strict;
use warnings;
my %data;
while (<DATA>) {
next if /^#/;
$_ .= <DATA> while s/\\\n// and not eof;
print;
chomp;
my ($key, $values) = split /=/;
my @values = map [ split /:/ ], split /,/, $values;
$data{$key} = \@values;
}
print $data{Property1}[1][1], "\n\n";
use Data::Dump;
dd \%data;
__DATA__
##
## Start of property1
##
##
Property1=\
a:b,\
a1:b1,\
a2,b2
##
## Start of propert2
##
Property2=\
c:d,\
c1:d1,\
c2,d2
輸出
Property1=a:b,a1:b1,a2,b2
Property2=c:d,c1:d1,c2,d2
b1
{
Property1 => [["a", "b"], ["a1", "b1"], ["a2"], ["b2"]],
Property2 => [["c", "d"], ["c1", "d1"], ["c2"], ["d2"]],
}
更新
我又讀了你的問題,我想你會喜歡你的數據的不同表現。這種變體保持proerty值作爲哈希值,而不是數組的數組,否則其行爲是相同的
use strict;
use warnings;
my %data;
while (<DATA>) {
next if /^#/;
$_ .= <DATA> while s/\\\n// and not eof;
print;
chomp;
my ($key, $values) = split /=/;
my %values = map { my @kv = split /:/; @kv[0,1] } split /,/, $values;
$data{$key} = \%values;
}
print $data{Property1}{a1}, "\n\n";
use Data::Dump;
dd \%data;
輸出
Property1=a:b,a1:b1,a2,b2
Property2=c:d,c1:d1,c2,d2
b1
{
Property1 => { a => "b", a1 => "b1", a2 => undef, b2 => undef },
Property2 => { c => "d", c1 => "d1", c2 => undef, d2 => undef },
}
是否有downvoting這個答案什麼特別的原因? – dan1111
不,只是upvoted you – snoofkin