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

如何搜索大型数据结构并返回一系列给出特定值的键/数组?

  •  1
  • con  · 技术社区  · 3 年前

    我已经从网站下载了一个复杂的JSON数据结构 https://api.ncbi.nlm.nih.gov/variation/v0/beta/refsnp/8127500

    它太大了,我找不到它。

    我尝试过Data::Search,但它没有返回我需要的内容。

    如何搜索数据结构/哈希,例如最小工作示例,

    my %d = (
        a => {
            b => 1
        }
    );
    

    寻找钥匙 1 然后回来 {a}{b} ?

    1 回复  |  直到 3 年前
        1
  •  1
  •   choroba    3 年前
    #! /usr/bin/perl
    use warnings;
    use strict;
    use feature qw{ say };
    
    sub walk { _walk(@_, []) }
    
    sub _walk {
        my ($value, $s, $path) = (@_);
        my @r;
        if (ref $s) {
            if (ref [] eq ref $s) {
                for my $i (0 .. $#$s) {
                    my $p = walk($value, $s->[$i], [@$path, $i]);
                    push @r, @$p if $p;
                }
            } elsif (ref {} eq ref $s) {
                for my $k (keys %$s) {
                    my $p = walk($value, $s->{$k}, [@$path, $k]);
                    push @r, @$p if $p;
                }
            }
            return \@r
    
        } else {
            return [$path] if $s == $value;
        }
    }
    
    my %d = (a => {b => [0, 1, 2]},
             c => [0, 1, [{d => 2, e => 3}]]);
    
    my $paths = walk(2, \%d, []);
    say "@$_" for @$paths;