我使用以下代码创建$ input:
push(@{$input->{$step}},$time);
,然后我将其保存在xml文件中,在下一次编译时,我从该文件中读取它。当我打印它时,我得到了下面的结构。
if(-e $file)
my $input =XMLin($file...);
print Dumper $input;
我得到了这个结构
$VAR1 = {
'opt' => {
'step820' => '0',
'step190' => '0',
'step124' => '0',
}
};
每个步骤都是时间..
push(@{$input->{$step}},$time3);
XmlOut($file, $input);
如果我再次运行该程序,我会得到这样的结构:
$VAR1 = {
'opt' => {
'step820' => '0',
'step190' => '0',
'step124' => '0',
'opt' => {
'step820' => '0',
'step190' => '0',
'step124' => '0'
}
}
我只需要覆盖步骤的值(例如:$ var1-> opt-> step820 = 2)。我怎样才能做到这一点?
答案 0 :(得分:1)
我只需要覆盖步骤的值(例如:$ var1-> opt-> step820 = 2)。我怎样才能做到这一点?
$input->{opt}->{step820} = 2;
答案 1 :(得分:1)
我会说我总是做什么,每当有人发帖询问XML::Simple
时 - 那就是XML::Simple
是欺骗性的 - 这一点都不简单。
Why is XML::Simple "Discouraged"?
所以 - 在你的例子中:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $xml= XML::Twig->new->parsefile($file);
$xml -> get_xpath('./opt/step820',0)->set_text("2");
$xml -> print;
问题在于,XML::Simple
对于解析您最初并不真正需要XML的XML
类型是有益的。
对于更简单的示例 - 您是否考虑过使用JSON
进行序列化?因为它更直接地反映了本机perl数据类型的哈希/数组结构。
你可以改为:
print {$output_fh} to_json ( $myconfig, {pretty=>1} );
请阅读:
my $myconfig = from_json ( do { local $/; <$input_fh> });
类似的东西:
#!/usr/bin/env perl
use strict;
use warnings;
use JSON;
my $input;
my $time = 0;
foreach my $step ( qw ( step820 step190 step124 ) ) {
push(@{$input->{$step}},$time);
}
print to_json ( $input, {pretty=>1} );
给出结果JSON:
{
"step190" : [
0
],
"step820" : [
0
],
"step124" : [
0
]
}
虽然实际上,我可能会:
foreach my $step ( qw ( step820 step190 step124 ) ) {
$input->{$step} = $time;
}
print to_json ( $input, {pretty=>1} );
由此给出;
{
"step190" : 0,
"step124" : 0,
"step820" : 0
}
JSON使用与perl
非常相似的约定 - 其中{}
表示键值对(散列),[]
表示数组。
答案 2 :(得分:0)
查看XMLout的AggregateIterable<Document> documents = contactUserCollection.aggregate(Arrays.asList(project(computed("fullName", "$firstName $lastName")), match(eq("fullName", firstLastName))));
选项。默认情况下,当“XMLout()”生成XML时,根元素将命名为“opt”。此选项允许您指定备用名称。
为RootName选项指定undef或空字符串将生成没有根元素的XML。