Perl将新元素插入到数组子阵列中

时间:2013-02-09 01:23:48

标签: xml arrays perl hash

您好我正在尝试插入一个新元素,以便我从这个

开始
   <explicit-group name="CDEV">
      <aip-address>1.1.1.1</aip-address>
      <aip-address>2.2.2.2</aip-address>
      <aip-address>3.3.3.3</aip-address>

到此

   <explicit-group name="CDEV">
      <aip-address>1.1.1.1</aip-address>
      <aip-address>2.2.2.2</aip-address>
      <aip-address>3.3.3.3</aip-address>
      <aip-address>99.99.99.254</aip-address>

我的代码如下,但我已经阅读了两天的引用和引用,但仍然无法得到它。我试图做一些不可能的事情,或者有人能告诉我如何做事。

谢谢!

use strict;
use XML::Simple;
use Data::Dumper;
my $xs = XML::Simple->new(
  XMLDecl => '<?xml version="1.0" encoding="UTF-8"?>',
  forcearray => [ 'item' ],
  keyattr    => {   },
  rootname   => 'SG-distribution',
);

my $opt = $xs->XMLin(\*DATA);


push @{ $opt->{'sa-coller'}->{'explicit-group'} } , { {'CDEV'}->{'aip-address'} };

print Dumper($opt);
print $xs->XMLout($opt);

__DATA__
<?xml version="1.0" encoding="UTF-8"?><SG-distribution>
  <sa-coller name="W8-C1" enabled="true" host="localhost" port="99">
    <ip-group name="home" ipAddressMask="192.168.0.*" match="glob"/>
    <ip-group name="home2" ipAddressMask="10.0.0.*" match="glob"/>
    <explicit-group name="CDEV">
      <aip-address>1.1.1.1</aip-address>
      <aip-address>2.2.2.2</aip-address>
      <aip-address>3.3.3.3</aip-address>
    </explicit-group>
    <explicit-group name="HYU"/>
    <explicit-group name="JUN"/>
  </sa-coller>
</SG-distribution>

1 个答案:

答案 0 :(得分:3)

你有一个数组,其中有四个元素代表每个explicit_group元素。您想要标识名称属性为CDEV的那个。由于它们没有按名称(但按位置)编制索引,因此您需要遍历数组以找到正确的元素。

for my $explicit_group (@{ $opt->{'sa-coller'}{'explicit-group'} }) {
  if ($explicit_group->{name} eq 'CDEV') {
     push @{ $explicit_group->{'aip-address'} }, '99.99.99.254';
   }
}