在Perl中测试不同类型的哈希值?

时间:2010-11-25 00:15:16

标签: perl validation hash xml-parsing

我正在编写一个小的Perl脚本,该脚本通过XML::Simple

遍历XML文件
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)

2 个答案:

答案 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)陈述的第二个条件。