【问题标题】:Testing for different types of hash values in Perl?在 Perl 中测试不同类型的哈希值?
【发布时间】:2011-05-15 10:26:54
【问题描述】:

我正在编写一个小的 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)

【问题讨论】:

    标签: perl validation hash xml-parsing


    【解决方案1】:

    它打印HASH(0x18948c4) 的原因是因为该值的内容实际上不是空的,而是一个hashref。当你打印一些东西时,Perl 会尝试对它进行字符串化,哈希引用的字符串化结果是 HASH(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,因此请尽可能多地向下访问数据结构以获取标量。

    【讨论】:

    • 我确实使用Data::Dumper 打印出数据结构 - 'Element' => {content} 结果到'Element'=>{}
    • 另外,您缺少打印语句之前的第一个 {
    • if 语句条件出现错误:Not an ARRAY reference at script.pl line xx. - 我将尝试取出两个测试的第一部分
    • 这给了我同样的错误......但如果我把第二个条件去掉,它就可以工作 - if (ref($detail->{Parsing}->{Through}->{XML}->{ElementContents}) eq ref({})
    • 'value' 是 ref({}) - 谢谢...如果我去掉 if 语句的第二个条件,它就可以工作
    【解决方案2】:

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

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

    我需要删除他给我的if(condition1 && condition2) 语句的第二个条件。

    【讨论】:

    • 这只是偶然的。 ref({}) 不检查是否为空,只检查任何 hashref。 ref({}) 的值是一个字符串“HASH”。
    • 我想我明白你在说什么,但是当我通过 foreach 循环运行它时,只有对空白值的引用被拾取...非空白值通过
    猜你喜欢
    • 2012-08-10
    • 2012-06-23
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    相关资源
    最近更新 更多