Perl怎样把hash中值相同的键合并,比如C10<=>"123",C12<=>"123"合并成“123<=>C10,C12",分不多,求高手帮忙

如题所述

第1个回答  2012-05-11
你这个问题很简单,但是你的箭头弄的我很糊涂,比如有hash,$hash{“C10”}="123",$hash{“C12”}="123",所以你想变成$hash{“C10,C12”}="123",这样么?
那你只能手动做,每读一个新的成员,就遍历hash已读过的成员,如果值相同,就用delete删除重复的,然后重新建立新的。
具体的,你看我给你写的简单小程序吧,随便写的简单算法,没有考虑时间复杂度优化的问题:
#!/usr/bin/perl -w
use warnings;

my %hash;
for(my $i=0;$i<6;$i++)
{
$hash{"C$i"}=$i;
}
$hash{"C33"}=3;
$hash{"C55"}=5;
$hash{"C333"}=3;
foreach my $k(keys(%hash))
{printf("$k --> $hash{$k}; ");}
printf("\n");
#combine the elements which have the same value
foreach my $k1(keys(%hash))
{
foreach my $k2(keys(%hash))
{
if(exists($hash{$k1}) and exists($hash{$k2}) and $hash{$k1} == $hash{$k2} and $k1 ne $k2)
{
$hash{"$k1,$k2"}= $hash{$k1};
delete($hash{$k1});
delete($hash{$k2});
}
}
}
foreach my $k(keys(%hash))
{printf("$k --> $hash{$k}; ");}
结果为:
C5 --> 5; C0 --> 0; C33 --> 3; C4 --> 4; C1 --> 1; C3 --> 3; C333 --> 3; C55 --> 5; C2 --> 2;
C0 --> 0; C4 --> 4; C1 --> 1; C5,C55 --> 5; C333,C33,C3 --> 3; C2 --> 2;
第一排为开始的hash,有重复2次的和3次的;
第二排会合并后的。追问

hash不能多对1的,我就想变成$hash{“C10,C12”}="123",

第2个回答  2012-05-11
晕死,有那么复杂么,直接拿分走人,呵呵
#! usr/bin/perl
%hash=("c1"=>"123",
"c2"=>"1234",
"c3"=>"123",
"c4"=>"1235",
);
foreach $key(sort keys %hash){
if(exists $hash1{$hash{$key}}){
$hash1{$hash{$key}}.=",$key";}
else{
$hash1{$hash{$key}}=$key;
}
}
foreach $key(sort keys %hash1){
print "$key<=>$hash1{$key}\n";
}本回答被提问者采纳
第3个回答  2012-05-11
my %hash1;
for values(%hash){
$hash1{$_} = [] if not exists $hash1{$_};
push @{$hash1{$_}}, $_;
}
第4个回答  2012-05-11
for keys(%hash){
$hash1{$hash{$_}}.=$_;
}
相似回答