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

在Perl中创建映射哈希

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

    我有两个字符串,从中创建哈希,第一个字符串值是键,第二个脚本值是键的值。下面是2个不同的字符串数据。

    First   Second
    PY       AB
    CH       BC
    QQ       CD
    TD       EF
    TD       IG
    TD       IH
    TD       RD
    TD       GD
    ES       SE
    HI       VG
    HI       NH
    

    从这个数据中,py将是关键,它的值将是ab,和所有这些值类似。

    但是我想为一个键处理一个特殊情况,我们有多个值,就像td,它有多个值,因为我想创建一个数组 喜欢 TD =[EF,IG,IH] 同样地,在所有情况下,我们都会遇到这种情况

    您能建议我们如何用Perl处理这个案例吗?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Kamal Nayan    7 年前

    您可以使用数组存储键的所有值,下面是演示程序。

    use Data::Dumper;    
    my @key = qw/PY CH QQ TD TD TD TD TD ES HI HI/;
    my @val = qw/AB BC CD EF IG IH RD GD SE VG NH/;
    my $hash = {};
    for (0..$#key) {
        push @{$hash->{$key[$_]}}, $val[$_];
    }
    print Dumper $hash;
    

    让我们运行它来查看输出:

    $VAR1 = {
              'HI' => [
                        'VG',
                        'NH'
                      ],
              'QQ' => [
                        'CD'
                      ],
              'TD' => [
                        'EF',
                        'IG',
                        'IH',
                        'RD',
                        'GD'
                      ],
              'PY' => [
                        'AB'
                      ],
              'ES' => [
                        'SE'
                      ],
              'CH' => [
                        'BC'
                      ]
            };
    
        2
  •  1
  •   stack0114106    7 年前

    另一个Perl,使用一个内衬

    perl -ne ' ($x,$y)=/(\S+)\s+(\S+)/; if( exists($kv{$x})) { @t=@{$kv{$x}}; push(@t,$y);$kv{$x}=[@t] } else { $kv{$x}=[$y]} ; END { foreach(keys %kv) { if(ref($kv{$_}) eq "ARRAY" ) { print "$_ => @{$kv{$_}}\n" } else { print "$_ ->$kv{$_}\n"  } }}' dev.txt
    

    产量

    HI => VG NH
    QQ => CD
    TD => EF IG IH RD GD
    PY => AB
    ES => SE
    CH => BC
    
        3
  •  0
  •   user1717259    7 年前

    逐行迭代文件。对于每个值,将其推入哈希图中的数组中。哈希映射由键值设置了键。

    这条线 push @{$hashref->{$key}}, $value;

    如果该键已经存在于映射中,则将该值推送到与该键关联的数组中。如果不是,则使用该值初始化数组,并使用该键初始化映射。

    my $hashref;
    while(<>){
    chomp;
    my ($key, $value) = split;
    push @{$hashref->{$key}}, $value;
    }