【问题标题】:Array duplicate removal program in PErl [duplicate]PErl 中的数组重复删除程序 [重复]
【发布时间】:2014-08-11 04:58:33
【问题描述】:

我是编程新手,我正在尝试在 Perl 中实现 c 逻辑来实现数组重复删除。

但我没有得到所需的输出。请指点一下我哪里出错了。

#!/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;

【问题讨论】:

  • 请不要标记与您的问题无关的任意语言。 -Python。
  • if ($x[$i]=$x[$j]) { - 您确定要在此处分配吗?

标签: perl


【解决方案1】:

当你引用数组的元素时它不想改变内容是好的。

@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

【讨论】:

  • 感谢大家抽出宝贵的时间提供宝贵意见。
【解决方案2】:

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

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

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

附带说明,此语句的返回值为$x[$j],它可能是也可能不是真实值,具体取决于您的数据。 (对于数值数据,0 和 undef 为 false,其他均为 true)

编辑:

看来这不是您的程序的全部问题,因为它仍然失败。尝试调试它似乎不是很好地利用时间,而在 Perl 中很容易完成重复数据删除,这是一种可怕的方式(对不起,但确实如此)。查看其他答案以了解如何使用哈希完成 - 利用哈希键是唯一的这一事实。

这就是uniqList::MoreUtils中实现去重功能的方式:

sub uniq (@) {
    my %seen = ();
    grep { not $seen{$_}++ } @_;
}

很简单,不是吗?只需返回之前看到的 not 键即可。

【讨论】:

    【解决方案3】:

    尝试为此使用哈希:

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

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

    【讨论】:

      猜你喜欢
      • 2017-06-04
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 2010-09-05
      • 2014-04-23
      相关资源
      最近更新 更多