免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: perljoker
打印 上一主题 下一主题

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

论坛徽章:
0
11 [报告]
发表于 2008-01-03 11:07 |只看该作者
原帖由 flw 于 2008-1-3 10:54 发表

hint: use values to instead keys.

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

  1. sub unique_array{
  2.         my $arref=shift;
  3.         @$arref =values %{{map {$_,$_} @$arref}};
  4. }
复制代码

报同样的错误

论坛徽章:
0
12 [报告]
发表于 2008-01-03 11:10 |只看该作者

晕,最新进展,不写函数,直接在代码中对数组使用,就可以实现了
keys还是不行,但是values是可以的,代码如下:
  1. @tmp=values %{{map {$_,$_} @tmp}};  #正确
复制代码

错误的:
  1. @tmp=keys %{{map {$_,$_} @tmp}};   #错误
复制代码

汗颜

论坛徽章:
0
13 [报告]
发表于 2008-01-03 11:27 |只看该作者
原帖由 flw 于 2008-1-3 10:54 发表

hint: use values to instead keys.

根据flw的提示
  1. sub unique_array{
  2.         my $arref=shift;
  3.         my %tmphash;
  4.         for(my $i=0;$i<@$arref;$i++){
  5.                 $tmphash{$arref->[$i]} = $arref->[$i];
  6.         }
  7.         my @key_arr = sort keys(%tmphash);
  8.         my @tem_arr;
  9.         for(my $i=0;$i<@key_arr;$i++){
  10.                                 $tem_arr[$i] = $tmphash{$key_arr[$i]};
  11.         }
  12.                 @$arref = @tem_arr;
  13. }
复制代码

这样我测试是行的...哪位在精简下

论坛徽章:
0
14 [报告]
发表于 2008-01-03 12:19 |只看该作者

回复 #13 hutule110 的帖子

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

我在11楼写了精简后的函数体了

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
15 [报告]
发表于 2008-01-03 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");
你是说把上面这些array处理到最後,只剩下一个
("sdf","sdlfk") ????

论坛徽章:
0
16 [报告]
发表于 2008-01-03 12:53 |只看该作者
原帖由 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

因为他认为是标量,不是引用,就报错,我的问题就是这个了

论坛徽章:
0
17 [报告]
发表于 2008-01-03 13:15 |只看该作者
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);
}

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
18 [报告]
发表于 2008-01-03 13:20 |只看该作者
所以你已经解决了嘛...

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


  1. #!/usr/bin/perl
  2. my @aa = (1,1);
  3. my @bb = (2,2);
  4. my @cc = (3,3);
  5. my @ary = (\@aa,\@bb,\@cc,\@cc);
  6. my %h = map{($_,$_)} @ary;
  7. my @tmp= values(%h);
  8. for(my $i=0;$i<@tmp;$i++){
  9.   for(my $j=0;$j<@{$tmp[$i]};$j++){
  10.        print "$i,$j : ".$tmp[$i][$j]."\n";
  11.   }
  12. }
复制代码

[ 本帖最后由 apile 于 2008-1-3 13:41 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2008-01-03 14:33 |只看该作者

恩,谢谢各位了,已经完美解决,已经测试了各种情况都可以使用
与调用方式也无关,我在一楼更新下……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP