2013-04-09 45 views
10

Tôi cần phải thêm các phần tử duy nhất vào một mảng từ các đầu vào chứa một số giá trị trùng lặp.Làm thế nào để tránh đẩy các giá trị trùng lặp vào một mảng Perl

Làm cách nào để tránh đẩy các giá trị trùng lặp vào một mảng Perl?

+0

bạn có thể sử dụng các khái niệm của một tập: http://stackoverflow.com/questions/3700037/how-can-i- represent-sets-in-perl – akonsu

+0

Luôn có 'List :: MoreUtils' uniq function nếu bạn không phản đối CPAN. – squiguy

Trả lời

12

Bạn chỉ cần sử dụng băm như thế này:

my %hash; 
$hash{$key} = $value; # you can use 1 as $value 
... 

này sẽ tự động ghi đè lên các phím trùng lặp.

Khi bạn cần in nó, chỉ cần sử dụng:

foreach my $key (keys %hash) { 
    # do something with $key 
} 

Nếu bạn cần phải sắp xếp các phím, sử dụng

foreach my $key (sort keys %hash) ... 
+2

Ồ, đây phải là bản ghi mới: câu trả lời được chấp nhận 4 năm sau :) – mvp

+1

Anh ấy phải chắc chắn điều này đã hiệu quả. P –

12
push(@yourarray, $yourvalue) unless grep{$_ == $yourvalue} @yourarray; 

kiểm tra này nếu giá trị là hiện diện trong mảng trước đẩy. Nếu giá trị không có, nó sẽ được đẩy.

Nếu giá trị không phải là số, bạn nên sử dụng eq thay vì ==.

+1

Giải pháp này trở nên rất kém hiệu quả khi mảng phát triển lớn - phương pháp băm được ưu tiên. –

3

bằng cách sử dụng ~~ chúng ta có thể phiên bản perl tối thiểu là 5.10.1

use v5.10.1; 
use strict; 
use warnings; 

my @ARRAY1 = qw/This is array of backup /; 
my @ARRAY2; 


my $value = "version.xml" ; 


sub CheckPush($$) 
{ 

my $val = shift (@_); 
my $array_ref= shift (@_); 

    unless ($val ~~ @$array_ref) 
    { 
     print "$val is going to push to array \n"; 
     push(@$array_ref,$val); 
    } 
return (@$array_ref); 
} 

@ARRAY1 = CheckPush($value,\@ARRAY1); 
print "out \n"; 
foreach $_ (@ARRAY1) { 
print "$_ \n"; 
} 

@ARRAY2 = CheckPush ($value,\@ARRAY2); 
print "out2 \n"; 
foreach $_ (@ARRAY2) { 
print "$_ \n"; 
} 
+0

Tóm lại: 'push (@yourarray, $ yourvalue) trừ khi $ yourvalue ~~ @yourarray;' – Codr

Các vấn đề liên quan