【问题标题】:Perl hash usagePerl 哈希使用
【发布时间】:2014-09-22 07:29:21
【问题描述】:

我正在尝试从以下示例文件创建哈希:


示例文件:

#NewName              OldName
Axc.Sx2.1_Axc.Wx2.1  1BDER
Axc.Sx2.1_Axc.Wx2.1  1ADER
Axc.Wxx.5            1DDER

哈希的键应该是newName,值应该是oldname。下面的代码适用于文件中唯一的行:

while (<$mapF>) {
    chomp $_;
    next if /^\s*(#.*)?$/;
    next if /^\s+.*$/;
    ##latestRuleName OldRuleName
    if ( $_ =~ /(\S+)\s+(\S+)/gi ) {
        # create list and apped $2
        $mapHash{$1} = $2;
    }
}

foreach ( keys %mapHash ) {
    print "$_\n";
}

但是对于重复的条目(如上面 sn-p 中的第 1 行和第 2 行),第一个条目会被第二个条目覆盖。因此,我的哈希中只有两个条目:

Axc.Sx2.1_Axc.Wx2.1  
Axc.Wxx.5

有没有办法获取 mapHash 中的所有三个条目?

【问题讨论】:

    标签: perl hash


    【解决方案1】:

    哈希中的键必须是唯一的。您可以为每个键存储多个值,但称为数组哈希或 HoA。这意味着每个键都存储了一个数组引用:

    push @{ $mapHash{$1} }, $2;
    

    【讨论】:

    • 非常感谢 choroba。现在如何访问这些数组的哈希?
    • @DiveshRastogi: $mapHash{key} 将是一个数组引用,因此您可以使用$mapHash{key}[0] 等为它下标,或者取消引用它以获得完整的数组:@{ $mapHash{key} }
    • 非常感谢 Choroba :) 现在一切就绪 :)
    【解决方案2】:

    您也可以使用Tie::Hash::MultiValue CPAN 模块,它为每个键存储多个值

    【讨论】:

    • 非常感谢 Miguel Prz 指出 CPAN: 模块。我以后肯定会用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    相关资源
    最近更新 更多