PERL中的数组重复删除程序

时间:2014-06-20 12:22:57

标签: arrays algorithm perl

我是编程新手,我正在尝试使用per逻辑在perl中实现数组重复删除。

但是我没有得到所需的输出。可以请指点我哪里出错。

#!/usr/bin/perl -w

@x = (2,2,3,1);
$n = 3;
for ($i=0;$i<$n;$i++) {
    for ($j=$i+1;$j<$n;$j++) {
        if ($x[$i]=$x[$j]) {
            for ($k=$j;$k<$n;$k++)
            {
                print " pip";
                $x[$k] = $x[$k+1];
                print "k = $x[$k] ,j = $x[$j]\n";
                $n--;
            }
        } else {
            $j++;
        }
    }
}
print @x;

3 个答案:

答案 0 :(得分:4)

你的逻辑看起来很可怕,但我确实发现你犯了一个菜鸟错误,这可能解释你的程序失败了:

if ($x[$i] = $x[$j]) {

在这里,您使用赋值运算符=而不是数字相等运算符==。当然,赋值会将右手参数分配给左手参数,这会覆盖你的数组并破坏你的输入。

作为旁注,此语句的返回值为$x[$j],可能是也可能不是真值,具体取决于您的数据。 (对于数值数据,0和undef将为false,其他都为真)

修改

似乎这不是你的程序的全部错误,因为它仍然失败。尝试调试它似乎不是很好的时间使用,当在Perl中轻松完成重复数据删除时,这是一种可怕的方式(抱歉,但确实如此)。查看有关如何使用哈希完成的其他答案 - 使用哈希键是唯一的事实。

这是重复数据删除功能uniqList::MoreUtils中实现的方式:

sub uniq (@) {
    my %seen = ();
    grep { not $seen{$_}++ } @_;
}
很简单,不是吗?只需返回之前看到not的密钥。

答案 1 :(得分:0)

尝试使用散列:

my %h;
for my $i (@x) {
  $h{$i}++
}
@x = (keys %h);

这会将@x的每个值放入%h作为键,并将元素的出现次数作为%h中的值。如果您只是检索密钥(keys %h),则会有@x的不同元素,然后您可以将其放回@x

答案 2 :(得分:0)

当你引用数组元素时,它不想更改内容。

@x = (2,2,3,1);
@hash { @x } = 0; 
@x = keys %hash;
print @x;

#use Array::Uniq from CPAN
use Array::Uniq;
@x = (2,2,3,1);
@x = uniq @x; #or uniq sort @x;
print @x; # result:231