perl哈希使用时,如果出现多个值相同,如何处理?

2025-05-03 14:09:58
推荐回答(1个)
回答(1):

首先你要明白 :

  1. hash 是无序的 ( 除非你用 Tie::IxHash ), 所以你基本上不能排出一个顺序的 hash, 你只能靠一条 array, 去找出 --- "如果排序了, 那 keys 的顺序会是怎样的"

  2. 在 hash 中, key 永远是绝对独一的, 所以, 在你现在的条件下, 即使上面我提到有 IxHash 可以做到有序的 hash, 来到这里也不适用了


这里写了一个 sub 给你参巧 :

sub rebuildHash {
    my %argv = @_;
    my ( %rebuild , @return );
    while ( my ( $k, $v ) = each %argv ) {
        if (defined $rebuild{$v} ) {
            if ( not ref $rebuild{$v} ) {
                my $prevKey = $rebuild{$v} ;
                $rebuild{$v} = [ $prevKey, $k ];
            }
            else { # $rebuild is not an array ref
                push @{$rebuild{$v}}, $k
            }
        }
        else { # if this key is not even existed
            $rebuild{$v} = $k
        }
    }    
    foreach my $k ( sort {$a<=>$b} keys %rebuild ) { # use { $a cmp $b } for string sort    
        if ( ref $rebuild{$k} ) {
            push @return, @{$rebuild{$k}};
        }
        else {
            push @return, $rebuild{$k};
        }
    }    
    return @return
}

#main
my %h = ( One => 1, Two => 2, AnotherOne => 1, Three => 3 ) ;
my @sorted = rebuildHash %h ;
foreach my $sd ( @sorted ) {
    print "$sd => $h{$sd} $/"
}
__END__
AnotherOne => 1 
One => 1 
Two => 2 
Three => 3