2014-06-20 43 views
-1

我是編程新手,我正在嘗試在Perl中實現數組重複刪除的c邏輯。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; 
+1

請不要標記您的問題無關任意語言。 -蟒蛇。 –

+1

'if($ x [$ i] = $ x [$ j]){' - 你確定要在這裏指定嗎? – RobEarl

回答

0

嘗試使用散列此:

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

這使的@x每個值到%h作爲密鑰,並具有元件作爲%h值的出現次數的數量。如果您只是檢索密鑰(keys %h),您將擁有@x的不同元素,然後您可以將其放回@x

4

你的邏輯看起來可怕,但我點你已經做了一個新手的錯誤,這可以解釋你的計劃失敗:

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

在這裏,您正在使用,而不是數值相等運算==的賦值操作符= 。當然,分配會將右手參數分配給左手參數,這會覆蓋陣列並破壞您的輸入。

作爲一個附註,此聲明的返回值爲$x[$j],根據您的數據,這可能是也可能不是真值。 (對於數值數據,0和民主基金將是錯誤的,所有其他的真)

編輯:

看來,這還不是全部是錯了你的程序,因爲它仍然失敗。嘗試調試它似乎不是一個很好的時間使用,當在Perl中輕鬆完成重複數據刪除時,這是一種可怕的方式(很抱歉,但是是這樣)。看看如何使用散列完成的其他答案 - 利用散列鍵是唯一的事實。

這是怎樣的重複數據刪除功能uniqList::MoreUtils實現:

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

相當簡單,不是嗎?只需返回前面看到的密鑰not即可。

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 
+0

感謝你們所有人的寶貴時間。 – user3760085