2011-07-16 16 views

Trả lời

2
my @array3; 
foreach my $elem (@array1) 
{ 
    if(!grep($elem eq $_, @array2)) 
    { 
     push(@array3, $elem); 
    } 
} 
15

Đặt các phần tử của mảng thứ hai vào một băm, để kiểm tra hiệu quả để xem có hay không một yếu tố đặc biệt được trong nó, sau đó lọc mảng đầu tiên cho chỉ những yếu tố mà không được trong mảng thứ hai:

my %array2_elements; 
@array2_elements{ @array2 } =(); 
my @array3 = grep ! exists $array2_elements{$_}, @array1; 
+0

+1 công việc tốt :) – vol7ron

+0

+1 cho phiên bản ngắn hơn của câu trả lời của riêng tôi (và cũng thích nghi với câu trả lời của riêng tôi). – Flimzy

0
my %total; 
$total{$_} = 1 for @array1; 
delete $total{$_} for @array2; 
my @diff = keys %total; 
+0

Đây là một phương pháp tốt nếu bảo quản thứ tự của mảng là không quan trọng. – Flimzy

+0

Vâng, đó là một nhược điểm của việc sử dụng băm. – TLP

0

Bạn có thể sử dụng mô-đun cpan được gọi là List::Compare.

use List::Compare; 
    my $lc = List::Compare->new(\@array1,\@array2); 
    my @newarray = $lc->get_symdiff; 
1

Sử dụng hàm băm làm bảng tra cứu. Khóa của nó là các phần tử của mảng thứ hai, các giá trị không quan trọng:

#!/usr/bin/env perl 
use strict; 
use warnings; 

my @array1 = ("abc", "cde", "fgh", "ijk", "lmn"); 
my @array2 = ("abc", "fgh", "lmn"); 

my @array1only; 

# build lookup table 
my %seen; 
foreach my $elem (@array2) { 
    $seen{$elem} = 1; 
} 

# find elements present only in @array1 
foreach my $elem (@array1) { 
    push @array1only, $elem unless $seen{$elem}; 
} 

print "Elements present only in \@array1: ", join(", ", @array1only), "\n"; 

Để biết thêm công thức 4.8 trong Perl Cookbook.

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