合并键时哈希的唯一值

时间:2016-08-26 13:24:26

标签: perl hash

我有一个包含制表符分隔列的文件,如下所示:

TR1 “\ t” 的P0C134

TR2 “\ t” 的P0C133

TR2 “\ t” 的P0C136

现在我将它们分成两个数组(每个列值一个),然后将它们转换为哈希值,但我想删除重复项(此处为TR2),同时合并它们的右列值...类似于此TR2 => P0C133,P0C136 ......怎么可能?在perl中有没有任何功能呢?

for($i=0;$i<=scalar@s_arr;$i++)
{
 if($s_arr[$i] eq $s_arr[$i+1])
  { push(@temp,$idx_arr[$i]); }

 else
  { 
   if(@temp eq "") 
    { $s_hash{$s_arr[$i]}=$idx_arr[$i]; }
   else
    {
      $idx_str=join(",",@temp);
      $s_hash{$s_arr[$i]}=$idx_str;
      @temp="";
     }
   }
}

这是我编写的代码,其中@s_arr存储左列值,而@idx_arr存储右列值

2 个答案:

答案 0 :(得分:4)

你可以避免使用两个数组并一举执行你想要的东西,将左侧值作为哈希键处理并使其成为数组引用,然后将与该键相关的右侧值推送到isf上:

use warnings;
use strict;

use Data::Dumper;

my %hash;

while (<DATA>){
    my ($key, $val) = split;
    push @{ $hash{$key} }, $val;
}

print Dumper \%hash;

__DATA__
TR1 P0C134
TR2 P0C133
TR2 P0C136

输出:

$VAR1 = {
    'TR1' => [
        'P0C134'
    ],
    'TR2' => [
        'P0C133',
        'P0C136'
    ]
};

答案 1 :(得分:0)

如果你想要相同的结构输出使用哈希哈希。

#!/usr/bin/perl
use warnings;
use strict;

my @arr = <DATA>;
my %hash;

foreach (@arr)
{
    my ($k,$v) = split(/\s+/,$_);
    chomp $v;
    $hash{$k}{$v}++;
}

foreach my $key1 (keys %hash)
{
    print "$key1=>";
    foreach my $key2 (keys $hash{$key1})
    {
        print "$key2,";
    }
    print "\n";
}

__DATA__
TR1 P0C134
TR2 P0C133
TR2 P0C136

输出是:

TR2=>P0C136,P0C133,
TR1=>P0C134,