我是编程新手,我正在尝试使用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;
答案 0 :(得分:4)
你的逻辑看起来很可怕,但我确实发现你犯了一个菜鸟错误,这可能解释你的程序失败了:
if ($x[$i] = $x[$j]) {
在这里,您使用赋值运算符=
而不是数字相等运算符==
。当然,赋值会将右手参数分配给左手参数,这会覆盖你的数组并破坏你的输入。
作为旁注,此语句的返回值为$x[$j]
,可能是也可能不是真值,具体取决于您的数据。 (对于数值数据,0
和undef将为false,其他都为真)
修改强>
似乎这不是你的程序的全部错误,因为它仍然失败。尝试调试它似乎不是很好的时间使用,当在Perl中轻松完成重复数据删除时,这是一种可怕的方式(抱歉,但确实如此)。查看有关如何使用哈希完成的其他答案 - 使用哈希键是唯一的事实。
这是重复数据删除功能uniq
在List::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