【问题标题】:Check data structure and disregard if hash or array检查数据结构并忽略哈希或数组
【发布时间】:2021-10-18 20:13:43
【问题描述】:

我在一个数组中有一堆哈希。检查我的键和值时,我得到了预期的输出,除了一些特殊情况,因为它们引用了更多的数组/哈希。

想想这样的事情:

@AoH = ( { 'husband' => "homer", 'wife' => "marge" },
         { 'people' => [{'Bob'=> 24, 'Lukas'=> 37}] },
         { 'vegetables' => { 'tomato' => "red", 'carrot' => "orange"} }); 

我的函数遍历数组并显示我的键和值,如下所示:

 sub function(...){    
    print "$key => $value\n";
 }

husband => homer
wife => marge
people => ARRAY(0x6b0d80)
Bob => 24
Lukas => 37
vegetables => HASH(0x2570d38)
tomato => red
carrot => orange

现在我想访问我的键和值,但是当获得像 ARRAY 或 HASH 这样的值时,我想忽略该散列而不打印它。

有什么方法可以只访问标量类型的值吗?

到目前为止,我尝试过这个:

if ($value eq 'ARRAY') {
}
elsif ($value eq ref {}) {
}
else {
print "$key => $value\n";
}

但是,它最终会打印出与上面完全相同的内容,并且不会忽略其他数据结构。

【问题讨论】:

  • 您可以使用ref 来检查该值是否为标量

标签: arrays perl data-structures hashmap scalar


【解决方案1】:

对于像你这样的任意数据结构,你可以使用Data::Traverse:

use warnings;
use strict;
use Data::Traverse qw(traverse);

my @AoH = ( { 'husband' => "homer", 'wife' => "marge" },
            { 'people' => [{'Bob'=> 24, 'Lukas'=> 37}] },
            { 'vegetables' => { 'tomato' => "red", 'carrot' => "orange"} }); 

traverse { print "$a => $b\n" if /HASH/ } \@AoH;

输出:

wife => marge
husband => homer
Bob => 24
Lukas => 37
carrot => orange
tomato => red

【讨论】:

    【解决方案2】:

    以下演示代码不使用外部模块,提供用于教育目的。

    use strict;
    use warnings;
    use feature 'say';
    
    my @AoH = (  { 'husband' => "homer", 'wife' => "marge" },
                 { 'people' => [{'Bob'=> 24, 'Lukas'=> 37}] },
                 { 'vegetables' => { 'tomato' => "red", 'carrot' => "orange"} });
                 
    drill_in( \@AoH );
    
    sub drill_in {
        my $data = shift;
        
        if( ref $data eq 'ARRAY' ) {
            drill_in($_) for @$data;
        } elsif ( ref $data eq 'HASH' ) {
            while( my($k, $v ) = each %{$data} ) {
                (ref $v eq 'ARRAY' or  ref $v eq 'HASH') ? drill_in($v) : say "$k => $v";
            }
        }
    }
    

    输出

    husband => homer
    wife => marge
    Lukas => 37
    Bob => 24
    tomato => red
    carrot => orange
    

    【讨论】:

      猜你喜欢
      • 2017-08-27
      • 2020-10-09
      • 2017-04-28
      • 2013-07-20
      • 2014-05-29
      • 2010-12-07
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      相关资源
      最近更新 更多