当前使用perl解析由多个部分组成的配置文件,该文件又可以由多个定义组成。我的实际文件有一个完全不同的话题,但我的解析器将解析这个例子中,太:将值存储在散列表中
SECTION Foo
HP 200
ATT 50 Slap
ATT 100 Kick
DESC This is Foo. What is love?
SECTION Bar
HP 2
ATT 1 Mumble
DESC This is Bar. Baby don't hurt me!
现在,我的解析器主要采用三个变量来存储数据:
my %sections;
my $parsedName;
my %parsedVars;
在阅读SECTION Bar
,它已填写如下:
%sections =(); # empty
$parsedName = "Foo";
%parsedVars = (
"HP" => "200",
"ATT" => ("50 Slap","100 Kick"),
"DESC" => "This is Foo. What is love?",
);
我想你明白了。现在,%parsedVars
字段的内容进行验证,如果成功的话,整个事情被存储到%sections
,这是我的代码使用的有:
use Storable qw(dclone);
# (...)
# Clone the Variables
$sections{$parsedName} = dclone (\%parsedVars);
# Prepare for next section
$parsedName = getSectionName $currentLine;
undef %parsedVars;
这是伤害的一部分,因为我不由于严格限制的运行时环境,我真的不想深入复制整个%parsedVars
,并且我也不允许包含除strict
以外的任何内容。
我觉得我应该从它的名字中分离哈希,并将它附加到$sections{$parsedName}
,但是我无法将我的头围绕如何完成。
# These hiccups aside,
# my parser works fine, which is nice.
# One completeness wide:
# Result looks like this, no surprise!
%sections = (
"Foo" => (
"HP" => "200",
"ATT" => ("50 Slap","100 Kick"),
"DESC" => "This is Foo. What is love?",
),
"Bar" => (
"HP" => "2",
"ATT" => "1 Mumble",
"DESC" => "This is Bar. Baby don't hurt me!",
),
);