代码之家  ›  专栏  ›  技术社区  ›  CheeseConQueso

在Perl中测试不同类型的散列值?

  •  0
  • CheeseConQueso  · 技术社区  · 15 年前

    我正在编写一个小的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的空字符串?它们作为 哈希(0x18948c4) 除非某些筛选已启用。

    2 回复  |  直到 15 年前
        1
  •  3
  •   DVK    15 年前

    它打印的原因 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,因此尽可能向下搜索数据结构以获得标量。

        2
  •  0
  •   CheeseConQueso    15 年前

    这是DVK的答案的修改版本,对我很有用:

    if (ref($detail->{Parsing}->{Through}->{XML}->{ElementContents}) eq ref({}))
    {
        ...empty element content...
    }
    

    我需要移除 if(condition1 && condition2) 他给我的陈述。