免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4407 | 回复: 18
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-02 16:47 |只看该作者 |倒序浏览
如题,就是有没有那么一个函数可以使数组元素唯一话,自动删除数组重复值
如果没有,那就自己写了

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

引用Lonki例子:
  1. my @array_a = (11, 22, 33);
  2. my @array_b = (1, \@array_a, 2, \@array_a, 2);
  3. print "$array_b[1], $array_b[1]->[0]\n";

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

  6. sub unique_array{
  7.     my $arref = shift;
  8.     my %tmphash = map {$_ => $_} @$arref;
  9.     @$arref = sort values(%tmphash);
  10. }
复制代码


精简函数版:
  1. sub unique_array{
  2.     my $arref = shift;
  3.     @$arref = sort values %{{map {$_ => $_} @$arref}};
  4. }
复制代码

精简非函数版:
  1. @array_b = sort values %{{map {$_ => $_} @array_b}};
复制代码

[ 本帖最后由 perljoker 于 2008-1-3 14:40 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-01-02 18:08 |只看该作者
在php 里面 ,可以使用array_unique

perl 的某个module 里面应该有吧

论坛徽章:
0
3 [报告]
发表于 2008-01-02 18:31 |只看该作者
my @aa = (1,1,2,2,3,3,4,4);
my %qq = my @pp = map {$_,undef} @aa;
my @aa = keys %qq;
print @aa;

论坛徽章:
0
4 [报告]
发表于 2008-01-02 18:37 |只看该作者
我自己写的函数是:

  1. sub unique_array{
  2.         my $arref=shift;
  3.         my %tmphash;
  4.         for(my $i=0;$i<@$arref;$i++){
  5.                 $tmphash{$arref->[$i]}++;
  6.         }
  7.         @$arref = sort keys(%tmphash);
  8. }
复制代码


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

为什么呢?因为经过了hash的转化?

论坛徽章:
0
5 [报告]
发表于 2008-01-02 18:47 |只看该作者
补充一点,去掉了use strict;
那些引用值也是无效的了,都变成未初始化的值了


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

论坛徽章:
0
6 [报告]
发表于 2008-01-02 21:24 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Array::Utils qw(:all);

  5. my @aa = (1,1,2,2,3,3,4,4);
  6. print $_, "\n" foreach unique(@aa);
复制代码

评分

参与人数 1可用积分 +5 收起 理由
flw + 5 我很赞同

查看全部评分

论坛徽章:
0
7 [报告]
发表于 2008-01-02 23:02 |只看该作者
测了下你的代码, 一切正常. 另外, 用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);
}


贴上有问题的代码???

[ 本帖最后由 Lonki 于 2008-1-2 23:07 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-01-03 10:31 |只看该作者
  1. #! /usr/bin/perl -w
  2. #        perl.pl

  3. use strict;        use warnings;

  4. my @aa=("sdf","sdlfk");my @bb=("sdf","sdlfk");
  5. my @hh=("sdf","sdlfk");my @cc=("sdf","sdlfk");
  6. my @gg=("sdf","sdlfk");my @dd=("sdf","sdlfk");
  7. my @ff=("sdf","sdlfk");my @ee=("sdf","sdlfk");

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

  13. unique_array(\@tmp);       
  14. print "@tmp\n";
  15. foreach(@tmp){
  16.         print $_->[0],"\n";
  17. }
  18. #sub tem{}
  19. sub unique_array{
  20.         my $arref=shift;
  21.         my %tmphash;
  22.         for(my $i=0;$i<@$arref;$i++){
  23.                 $tmphash{$arref->[$i]}++;
  24.         }
  25.         @$arref = sort keys(%tmphash);
  26. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2008-01-03 10:37 |只看该作者
就说,他还识别那个地址的字符串
但貌似他认为那是个字符串,不是引用指向的东西

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


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

[ 本帖最后由 perljoker 于 2008-1-3 10:50 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2008-01-03 10:54 |只看该作者
原帖由 perljoker 于 2008-1-3 10:37 发表
就说,他还识别那个地址的字符串
但貌似他认为那是个字符串,不是引用指向的东西

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


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

hint: use values to instead keys.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP