不是test.pl第11行的SCALAR引用



我的脚本在第11行显示非标量引用

我的脚本是

#!/usr/bin/perl -w
@files = <*.xml>;
foreach $file (@files) {#!/usr/bin/perl
# use module
use XML::Simple;
# create object
$xml = new XML::Simple;
# read XML file
$data = $xml->XMLin("$file");
# access XML data
foreach my $entry (@{$data->{result}->{entries}->{entry}}){
print "$file $data->{result}->{entries}->{entry}->{ip} $data->{result}->{entries}->{entry}->{mac}n";
}}

我在下面的文件夹中有一个xml文件

我想列出所有文件中的所有ips和mac地址,我正在尝试使用foreach我的$条目。

 <?xml version="1.0"?>
-<response status="success">
  -<result>
     <max>1000</max>
     <total>2</total>
     <timeout>1800</timeout>
     <dp>dp0</dp>

    -<entries>

     -<entry>
        <status> c </status>
        <ip>10.0.0.1</ip>
        <mac>00:00:oo:88:70:41</mac>
        <ttl>1590</ttl>
        <interface>ethernet1/2</interface>
        <port>ethernet1/2</port>
      </entry>

      -<entry>
        <status> c </status>
        <ip>17.0.0.1</ip>
        <mac>00:0f:00:00:00:42</mac>
        <ttl>1500</ttl>
        <interface>ethernet1/4</interface>
        <port>ethernet1/4</port>
      </entry>
    </entries>
   </result>
 </response>
  1. 不要使用XML::Simple。它的文档告诉你

不鼓励在新代码中使用此模块。

  1. 使用Data::Dumper可视化复杂的数据结构。

    use Data::Dumper;
    print Dumper($data);
    

    您将看到entry是一个数组引用,而不是散列。你需要说出你想要的数组元素:

    print $data->{result}{entries}{entry}[0]{ip}, ' ',
          $data->{result}{entries}{entry}[0]{mac}, "n";
    

    或者迭代所有这些:

    for my $entry (@{ $data->{result}{entries}{entry} }) {
        print $entry->{ip}, ' ', $entry->{mac}, "n";
    }
    

    请注意,方括号和花括号之间的箭头是可选的。

最新更新