首页 > 解决方案 > 在 perl 中推送到数组之前检查哈希值

问题描述

为了创建一个 Json 文件,我在数组中推送一个哈希值,但是现在值被重复了,我不想添加那些已经在数组中的哈希值。

foreach my $corp_id(@{corpId}) {
    foreach my $rcode(@{$brands_map->{$corp_id->{s_brand}}}) {
            my corpIdAccessCode;
            $corpIdAccessCode->{accessCode} = $corp_id->{s_id};
            $corpIdAccessCode->{corporateId} = $corp_id->{c_id};
            $corpIdAccessCode->{bcode} = $rcode;
            push @{$accessCode_array} ,$corpIdAccessCode; **// Here before pushing to array i want to have a check wheather $corp_id->{s_id}, $corp_id->{c_id} and  $rcode already exists or not in the accessCode_array**
    }
}

所以从下面的哈希数组中我不想要重复的

[
      {
        "accessCode": "NQ",
        "bcode": "PD",
        "corporateId": "12"
      },
      {
        "accessCode": "NQ",
        "bcode": "CI",
        "corporateId": "2122121"
      },
      {
        "accessCode": "NQ",
        "bcode": "CI",
        "corporateId": "2122121"
      },
      {
        "accessCode": "CD",
        "bcode": "PD",
        "corporateId": "12"
      },

代码更改的最终输出应给出如下结果:

[
      {
        "accessCode": "NQ",
        "bcode": "PD",
        "corporateId": "12"
      },
      {
        "accessCode": "NQ",
        "bcode": "CI",
        "corporateId": "2122121"
      },

      {
        "accessCode": "CD",
        "bcode": "PD",
        "corporateId": "12"
      },

或者有什么方法可以从数组中删除重复的哈希值。

标签: perl

解决方案


在之后推送或删除重复项之前检查整个数组是低效的。所以你需要跟踪你已经推送了哪些数据:

my $seen;
foreach my $corp_id(@{corpId}) {
    foreach my $rcode(@{$brands_map->{$corp_id->{s_brand}}}) {
            my ($k1, $k2, $k3) = ($corp_id->{s_id}, $corp_id->{c_id}, $rcode);
            if ($seen->{$k1}->{$k2}->{$k3}) {
                next;
            }
            $seen->{$k1}->{$k2}->{$k3} = 1;

            my $corpIdAccessCode;
            $corpIdAccessCode->{accessCode} = $corp_id->{s_id};
            $corpIdAccessCode->{corporateId} = $corp_id->{c_id};
            $corpIdAccessCode->{bcode} = $rcode;
            push @{$accessCode_array} ,$corpIdAccessCode; **// Here before pushing to array i want to have a check wheather $corp_id->{s_id}, $corp_id->{c_id} and  $rcode already exists or not in the accessCode_array**
    }
}

my ($k1, $k2, $k3)只是为了使它更短,更具可读性。


推荐阅读