我的脚本在第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>
- 不要使用XML::Simple。它的文档告诉你
不鼓励在新代码中使用此模块。
-
使用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"; }
请注意,方括号和花括号之间的箭头是可选的。