在Perl中创建映射哈希

时间:2019-02-07 17:02:05

标签: perl

我有2个要从其创建哈希的字符串,first_string的值将是key,第二个脚本的值将是key。以下是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 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

使用单线的另一个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

答案 2 :(得分:0)

逐行遍历文件。对于每个值,将其推入哈希图中的数组。哈希图由您的键值确定键。

此行push @{$hashref->{$key}}, $value;

如果键已存在于映射中,则将值推入与该键关联的数组。如果不是,则使用该值初始化数组,然后使用该键初始化地图。

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