Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl:覆盖结构成员值_Perl - Fatal编程技术网

Perl:覆盖结构成员值

Perl:覆盖结构成员值,perl,Perl,我正在使用以下代码创建$input: push(@{$input->{$step},$time),然后我将其保存在一个xml文件中,在下一次编译时,我从该文件中读取它。当我打印它时,我得到的结构如下 if(-e $file) my $input =XMLin($file...); 打印转储程序$input 我得到了这个结构 $VAR1 = { 'opt' => { 'step820' => '0', 'step

我正在使用以下代码创建$input:
push(@{$input->{$step},$time),然后我将其保存在一个xml文件中,在下一次编译时,我从该文件中读取它。当我打印它时,我得到的结构如下

if(-e $file)
my $input =XMLin($file...);
打印转储程序$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)。我该怎么做

我只需要覆盖步骤的值(例如:$var1->opt->step820=2)。我该怎么做


查看XMLout的
RootName
选项。默认情况下,当“XMLout()”生成XML时,根元素将命名为“opt”。此选项允许您指定替代名称


为RootName选项指定unde或空字符串将生成没有根元素的XML。

我要说的是,每当有人发帖询问
XML::Simple
——也就是说
XML::Simple
是骗人的——一点也不简单

因此,在您的示例中:

#!/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> }); 
给出以下结果:

{
   "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非常相似的约定,
{}
表示键值对(散列),而
[]
表示数组

首先不要使用XML::Simple,这很可怕。并发布一些带有所需输出的示例XML。。我知道还有其他方法,期望的输出与第一个转储输出相同<代码>$VAR1={'opt'=>{'step820'=>'0','step190'=>'0','step124'=>'0',}我试图做的是访问这些值并修改它们请求XML::Simple,因为它是“基本的”(至少我告诉过它),它是基本的,就像试图通过旋转一块木头点火一样。这是一项艰苦的工作,而且容易失败,顺便问一下,你不想用你口袋里的打火机吗?
foreach my $step ( qw ( step820 step190 step124 ) ) {
    $input->{$step} = $time;
}

print to_json ( $input, {pretty=>1} );
{
   "step190" : 0,
   "step124" : 0,
   "step820" : 0
}