[已解决]:有对数组进行唯一化操作的函数吗?



QUOTE:
原帖由 flw 于 2008-1-3 10:54 发表

hint: use values to instead keys.

我也怀疑这样的问题
我做了以下的修改,唯一化函数改为:

[Copy to clipboard] [ - ]
CODE:
sub unique_array{
        my $arref=shift;
        @$arref =values %{{map {$_,$_} @$arref}};
}

报同样的错误

晕,最新进展,不写函数,直接在代码中对数组使用,就可以实现了
keys还是不行,但是values是可以的,代码如下:

[Copy to clipboard] [ - ]
CODE:
@tmp=values %{{map {$_,$_} @tmp}};  #正确

错误的:

[Copy to clipboard] [ - ]
CODE:
@tmp=keys %{{map {$_,$_} @tmp}};   #错误

汗颜


QUOTE:
原帖由 flw 于 2008-1-3 10:54 发表

hint: use values to instead keys.

根据flw的提示

[Copy to clipboard] [ - ]
CODE:
sub unique_array{
        my $arref=shift;
        my %tmphash;
        for(my $i=0;$i<@$arref;$i++){
                $tmphash{$arref->[$i]} = $arref->[$i];
        }
        my @key_arr = sort keys(%tmphash);
        my @tem_arr;
        for(my $i=0;$i<@key_arr;$i++){
                                $tem_arr[$i] = $tmphash{$key_arr[$i]};
        }
                @$arref = @tem_arr;
}

这样我测试是行的...哪位在精简下
也许你这样是可以实现的,但是,你这样的代码,就失去实用价值了
在函数里面进行测试和输出,不能证明在调用函数时就是正确的
况且你没理解我的意思,我得到的@tem_arr里面都是对其他数组的引用
我想要进行unique以后还能解引用,而不是看数组里面是不是还是些地址一样的“字符串”(无法解引用)

我在11楼写了精简后的函数体了
my @aa=("sdf","sdlfk");my @bb=("sdf","sdlfk");
my @hh=("sdf","sdlfk");my @cc=("sdf","sdlfk");
my @gg=("sdf","sdlfk");my @dd=("sdf","sdlfk");
my @ff=("sdf","sdlfk");my @ee=("sdf","sdlfk");
你是说把上面这些array处理到最後,只剩下一个
("sdf","sdlfk") ????


QUOTE:
原帖由 apile 于 2008-1-3 12:32 发表
my @aa=("sdf","sdlfk");my @bb=("sdf","sdlfk");
my @hh=("sdf","sdlfk");my @cc=("sdf","sdlfk");
my @gg=("sdf","sdlfk");my @dd=("sdf","sdlfk");
my @ff=("sdf","sdlfk");my @ee=("sdf","sdlfk");
你是 ...

哈哈,不是的,其实 @aa与@bb里面的值因为是不同的,我懒得修改,就copy了
其实就想有个@tmp=(\@aa,\@bb,\@cc,\@dd,\@ee,\@ff,\@aa,\@bb); 然后发现里面的值有重复,如\@aa和后面的\@aa,当然不是有意弄重复
现在就想唯一化,成为,@tmp=(\@aa,\@bb,\@cc,\@dd,\@ee,\@ff);
那我想print $tmp[0][0];能得到里面的值 sdf

因为他认为是标量,不是引用,就报错,我的问题就是这个了
my @array_a = (11, 22, 33);
my @array_b = (1, \@array_a, 2, \@array_a, 2);
print "$array_b[1], $array_b[1]->[0]\n";

unique_array(\@array_b);
print "$array_b[2], $array_b[2]->[0]\n";

sub unique_array{
    my $arref = shift;
    my %tmphash = map {$_ => $_} @$arref;
    @$arref = sort values(%tmphash);
}
所以你已经解决了嘛...

剛剛發現$tmp[0][0]也行...
用$tmp->[0]->[0]也行...
$tmp[0]->[0]也行

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
my @aa = (1,1);
my @bb = (2,2);
my @cc = (3,3);
my @ary = (\@aa,\@bb,\@cc,\@cc);
my %h = map{($_,$_)} @ary;
my @tmp= values(%h);
for(my $i=0;$i<@tmp;$i++){
  for(my $j=0;$j<@{$tmp[$i]};$j++){
       print "$i,$j : ".$tmp[$i][$j]."\n";
  }
}


恩,谢谢各位了,已经完美解决,已经测试了各种情况都可以使用
与调用方式也无关,我在一楼更新下……