我正在编写一个小的Perl脚本,该脚本通过XML::Simple
my $xml = new XML::Simple;
my $detail= $xml->XMLin($xml_local);
有时,XML中元素的内容为空。
当XML中的元素中没有内容时,我尝试使用以下内容打印出内容:
print $detail->{Parsing}->{Through}->{XML}->{ElementContents}
我得到了输出:
HASH(0x18948c4)
......或类似的东西......唯一的区别是()的
之间的字符我想测试内容是否为空并将变量默认为其他内容 - 可能是''
或""
- 除了散列引用/地址/之外的任何内容。
我试过这个,但得到的错误是它不是数组引用:
print $detail->{Parsing}->{Through}->{XML}->{ElementContents}[0]
<小时/> 更新
使用Data::Dumper
输出其中一个元素:
'something' => [
{
'somedetail' => '',
'somedetail' => '',
'somedetail' => 'http://www.google.com'
'somedetail' => 'google',
'somedetail' => '1',
'somedetail' => '01/21/02'
},
如何使用Perl测试这些''
空字符串?除非启用了某些过滤,否则它们将返回HASH(0x18948c4)
。
答案 0 :(得分:3)
它打印HASH(0x18948c4)
的原因是因为该值的内容实际上不是空的,而是一个hashref。当您打印某些内容时,Perl会尝试对该内容进行字符串化,并且哈希引用的字符串化结果为HASH(address)
,其中address是实际哈希的地址。
按如下方式打印该hashref的实际内容:
use Data::Dumper;
print Data::Dumper->Dump([$detail->{Parsing}->{Through}->{XML}->{ElementContents}]);
如果你说有“无内容”,它可能是一个空的hashref:
$VAR1 = {};
如果是,您可以通过以下方式检查:
if (ref($detail->{Parsing}->{Through}->{XML}->{ElementContents}) eq ref({})
&& !keys %{ $detail->{Parsing}->{Through}->{XML}->{ElementContents} })
print "No contents, empty hashref";
}
第一个条件确保它是一个hashref,第二个,它的取消引用产生的哈希有零元素作为其键 - 这意味着它是一个被引用的空哈希。
但是,我非常怀疑它是一个空的哈希,我记得XML :: Simple - 如上所示进行Data :: Dumper打印将向您展示如何处理它。你应该总是以这种方式打印出未知的数据结构,以弄清楚如何处理它们。
,例如,如果您的Data :: Dumper输出是:
$VAR1 = {
'a' => 1
};
然后你需要打印$detail->{Parsing}->{Through}->{XML}->{ElementContents}->{a}
,显然。同样,要小心只打印标量而不是arrayref或hashref的内容,因此请根据需要调整数据结构以获得标量。
答案 1 :(得分:0)
这是DVK答案的修改版本,对我有用:
if (ref($detail->{Parsing}->{Through}->{XML}->{ElementContents}) eq ref({}))
{
...empty element content...
}
我需要删除他给我的if(condition1 && condition2)
陈述的第二个条件。