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

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

如题,就是有没有那么一个函数可以使数组元素唯一话,自动删除数组重复值
如果没有,那就自己写了

已经得到解决,在于keys得到的数组会丢失引用信息(认为是字符串,不是引用了,具体我也不懂为什么)

引用Lonki例子:

[Copy to clipboard] [ - ]
CODE:
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);
}

精简函数版:

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

精简非函数版:

[Copy to clipboard] [ - ]
CODE:
@array_b = sort values %{{map {$_ => $_} @array_b}};

在php 里面 ,可以使用array_unique

perl 的某个module 里面应该有吧
my @aa = (1,1,2,2,3,3,4,4);
my %qq = my @pp = map {$_,undef} @aa;
my @aa = keys %qq;
print @aa;
我自己写的函数是:

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

但是,发现一个很重要的问题,数组里面的数组引用的信息似乎丢失了(数组里面存的全都是数组的引用)
Can't use string ("ARRAY(0x8ffd680)") as an ARRAY ref while "strict refs" in use at ./nhx_cmp.pl

为什么呢?因为经过了hash的转化?
补充一点,去掉了use strict;
那些引用值也是无效的了,都变成未初始化的值了


顺便问一句:
royalzhang 的
my %qq = my @pp = map {$_,undef} @aa;
的@pp我感觉没什么用吧……,直接用%qq=就可以了吧?


[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
use Array::Utils qw(:all);

my @aa = (1,1,2,2,3,3,4,4);
print $_, "\n" foreach unique(@aa);

测了下你的代码, 一切正常. 另外, 用hash就不需要计数了吧.
use strict;
use warnings;
#use 5.010;
use Data::Dumper;

my @array_a = (1, 2, 3);
my @array_b = (1, \@array_a, 2, \@array_a, 2);
unique_array(\@array_b);
print(Dumper(\@array_b));

sub unique_array{
    my $arref = shift;
    my %tmphash;
    for(my $i=0;$i<@$arref;$i++){
        $tmphash{$arref->[$i]}++;
    }
    @$arref = sort keys(%tmphash);
}


贴上有问题的代码???



[Copy to clipboard] [ - ]
CODE:
#! /usr/bin/perl -w
#        perl.pl

use strict;        use warnings;

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");

my @tmp=(\@aa,\@bb,\@cc,\@dd,\@ee,\@ff,\@aa,\@bb);
print "@tmp\n";
foreach(@tmp){
        print $_->[0],"\n";
}

unique_array(\@tmp);       
print "@tmp\n";
foreach(@tmp){
        print $_->[0],"\n";
}
#sub tem{}
sub unique_array{
        my $arref=shift;
        my %tmphash;
        for(my $i=0;$i<@$arref;$i++){
                $tmphash{$arref->[$i]}++;
        }
        @$arref = sort keys(%tmphash);
}

就说,他还识别那个地址的字符串
但貌似他认为那是个字符串,不是引用指向的东西

你那个代码还是无法得到@array_a里面的值


谢谢6楼提供的模块,可是也不能继续用引用
大家帮我分析下,是我自己的问题么?



QUOTE:
原帖由 perljoker 于 2008-1-3 10:37 发表
就说,他还识别那个地址的字符串
但貌似他认为那是个字符串,不是引用指向的东西

你那个代码还是无法得到@array_a里面的值


谢谢6楼提供的模块,可是也不能继续用引用
大家帮我分析下,是我自己的问题么?

hint: use values to instead keys.