你这个问题很简单,但是你的箭头弄的我很糊涂,比如有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",