Perl:覆盖结构成员值

时间:2016-02-15 13:58:54

标签: perl

我使用以下代码创建$ 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)。我怎样才能做到这一点?

3 个答案:

答案 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。