我应该如何使用XML :: Simple处理未定义的引用?

时间:2011-10-19 08:02:21

标签: xml perl error-handling

我正在使用这些选项

使用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} }";
};

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

首先,你真的需要启用'ForceArray'选项吗?也许最好使用标量值并检查它们(可能)所在的数组?

我使用的可能未定义的数组引用解决方案是:

my $string = join '', @{ $var || [] };

这意味着“取消引用变量或空匿名数组引用”。

在你的情况下,它将是

$nb = join '', @{ $_->{hostname} || [] };