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

从哈希Perl内的数组中获取唯一的值列表

  •  0
  • Developer  · 技术社区  · 7 年前

    我有一个包含数组列表的哈希,我必须从该数组中获得一个唯一的列表。但当我试图识别时,我没有得到任何错误或唯一的列表。

    注:我不想使用任何模块 .

    下面是具有数组的哈希的示例结构:

    '15445' => { 'str' => {
                            'TOKEN' => [
                               'HC',
                               'HC',
                               'HC',
                               'HC',
                               'HC',
                               'HC'
                                ]
                    }
            }
    

    如何从数组中获取唯一的值列表 TOKEN

    foreach my $id (keys %$client) {
        my @unique_srp_id;
        @unique_srp_id = uniq($hash->{$id}->{str}->{TOKEN});
        print @unique_srp_id;
    }
    
    sub uniq {
        my %seen;
        grep !$seen{$_}++, @_;
    }
    

    有人能告诉我我在这里做错了什么吗?

    2 回复  |  直到 7 年前
        1
  •  4
  •   Grinnz    7 年前

    您正在向函数传递一个包含值的数组引用,但函数希望值直接位于 @_ .

    my @unique = uniq(@{$hash->{$id}{str}{TOKEN}});
    

    在Perl5.24+上,您可以使用Postderef使这个看起来更好(也许?)

    my @unique = uniq($hash->{$id}{str}{TOKEN}->@*)
    

    在Perl5.26+上,list::util的核心版本已经足够新(1.45),可以包含 uniq 它将比纯Perl版本更快,而且还可以处理 undef 价值观明显。

        2
  •  2
  •   mob    7 年前

    uniq 需要列表,但 $hash->{$id}->{str}->{TOKEN} 是数组引用(单个元素)。将数组传递给 UNIQ

     uniq(@{$hash->{$id}{str}{TOKEN}})
    

    或写 UNIQ 期望数组引用

    sub uniq {
        my %seen;
        grep !$seen{$_}++, @{$_[0]};
    }