【问题标题】:unique value in hash while merging their keys合并键时哈希中的唯一值
【发布时间】:2016-08-29 13:03:50
【问题描述】:

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

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 存储右列值

【问题讨论】:

    标签: perl hash


    【解决方案1】:

    您可以避免使用两个数组并一举执行您想要的操作,将左侧值视为哈希键并使其成为数组引用,然后将与该键相关的右侧值推送到该区域:

    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'
        ]
    };
    

    【讨论】:

    • :O 我准备的答案中的代码是相同的!除了我在\t 而不是\s+ 上拆分隐含(右侧字符串中可能有空格)
    • :) 是的,这是一个非常常见的代码习惯用法,可以到达 OP 需要的位置
    • 我是否可以建议而不是 split /\s+/ split; 是所需要的 - 它们几乎相同,只是后者跳过了前导空格(这是没有实际意义的)。两者都有效,但我觉得后者更清楚。 (
    • @Sobrique:同意并修复。老实说,我从来没有意识到(或不知何故忘记了)split 默认分割的不仅仅是一个空格字符。学到了新东西,我做到了!
    • @stevieb ....我的男人,你一定是虔诚的存在...你将我的 18 行代码减少到 3 行...我怎样才能像这样学习 perl ??...是的请您解释一下“push @{ $hash{$key} }, $val;”你在哪里选择了唯一的键????
    【解决方案2】:

    如果您想要相同的结构输出,请使用散列的散列。

    #!/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,
    

    【讨论】:

      猜你喜欢
      • 2011-02-15
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 2012-02-17
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多