我有一個大的數據集基本上可以歸結爲這樣的工作:優雅解析硬數據在Perl
my $input = q(
<foo>111</foo>
<foo>222</foo>
<foo>333</foo>
<foo></foo>
<foo>555</foo>
); # new-lines are either CR+LF, LF, or CR
根據上面的例子,讓我們假設以下限制實際上是:
- 總是會有5行數據。
- 每行中的數據都包含在一個標記中,如
<foo>...</foo>
。 - 數據將不包含嵌套標籤。
- 所有行都使用相同的標記(例如
foo
)來封裝其數據。
最終,採取上述作爲數據源,我想用這個東西類似於結束:
my %values = (
one => '111',
two => '222',
three => '333',
four => '',
five => '555'
);
這是我的嘗試:
my @vals = $input =~ m!<foo>(.*?)</foo>!ig;
if (scalar @vals != 5) {
# panic
}
my %values = (
one => shift @vals,
two => shift @vals,
three => shift @vals,
four => shift @vals,
five => shift @vals
);
這是我想要的,但它看起來很醜並且不很靈活。不幸的是,這是我現在所能做的最好的,因爲我是Perl新手。
因此,考慮到上述限制,這樣做更優雅的方式是什麼?
的最後一個例子是很整潔。謝謝! – jnaturelle 2010-12-11 17:35:40
最後一個例子*是*有點整齊,但假設有一個固定數量的鍵。如果你希望它更靈活,並且在你繼續生成密鑰的時候,將它映射到一個大小相同的列表(並將該列表分配給散列)。 'map'和'grep'是朋友。 :) – fennec 2010-12-11 17:43:22