我正在使用这些选项
使用XML :: Simple解析XML文件my $xml = XML::Simple->new(ForceArray => 1, KeyAttr => 1, KeepRoot => 1);
这是一个示例xml文档
<ip>
<hostname>foo</hostname>
<info>server</info>
<soluton>N/A</solution>
<cats>
<cat>
<title>Baz</title>
<flags>0</flags>
</cat>
<cat><title>FooBar</title></cat>
</cats>
</ip>
<ip>
<info>client</info>
<diagnosis>N/A</diagnosis>
<cats>
<cat><title>Foo</title></cat>
<cat>
<title>Bar</title>
<update>Date</update>
</cat>
</cats>
</ip>
正如您所看到的,并非每个节点都具有hostname属性,这会导致我的脚本在尝试获取主机名时出现“无法使用未定义的值作为ARRAY引用”错误
$nb = "@{ $_->{hostname} }";
xml中有几个可选元素(超过十几个)。我该怎么处理? 我应该在分配之前检查元素的存在吗?
if ( @{ $_->{hostname} ) { $nb = "@{ $_->{hostname} }" }
if ( @{ $_->{solution} ) { $s = "@{ $_->{solution} }" }
if ( @{ $_->{diagnosis} ) {...}
我应该使用eval块吗?
eval { $nb = "@{ $_->{hostname} }" };
也许
eval {
$nb = "@{ $_->{hostname} }";
$s = "@{ $_->{solution} }";
$d = "@{ $_->{diagnosis} }";
};
有更好的方法吗?
答案 0 :(得分:0)
首先,你真的需要启用'ForceArray'选项吗?也许最好使用标量值并检查它们(可能)所在的数组?
我使用的可能未定义的数组引用解决方案是:
my $string = join '', @{ $var || [] };
这意味着“取消引用变量或空匿名数组引用”。
在你的情况下,它将是
$nb = join '', @{ $_->{hostname} || [] };