2014-01-23 249 views
1

我有以下三組(陣列)我需要執行一個像這樣的操作((A-B)UC)上。 有人可以在Perl中有這個邏輯嗎? 這裏是我的代碼,我可以能夠檢查是否是A和B的子集或沒有,但我不能這樣做「A-B」:比較陣列和刪除陣列

my @array = (MAJOR,MINOR,MM,DD,YY); 
my @exclude = (MM,MINOR,YY); 
my @include = (LICENSE,VALID); 
foreach (@exclude) { 
if ($_ ~~ @array) { 
print "\n $_ is defined in variables and it will be excluded \n"; 
@array = grep {!/\$_/} @array; 
print "@array \n"; 
} 
else { 
print "\n $_ is not defined under variables please check the files \n"; 
exit 100; 
} 
} 
foreach (@array){ 
print "$_ \n"; 
} 

我懷疑事情是錯誤的,我的邏輯使用grep操作,即刪除操作。

回答

1

一個問題是:$_在外層循環中被重新定義在grep塊內的每個元素@array。你需要有不同的名字。另外,你的正則表達式缺少錨點;然而,而不是一個正則表達式,只是使用字符串不等式。試試這個:

my @array = qw(MAJOR MINOR MM DD YY); 
my @exclude = qw(MM MINOR YY); 
my @include = qw(LICENSE VALID); 
foreach my $e (@exclude) { 
    if ($e ~~ @array) { 
    print "\n $e is defined in variables and it will be excluded \n"; 
    @array = grep {$e ne $_} @array; 
    print "@array \n"; 
    } else { 
    print "\n $e is not defined under variables please check the files \n"; 
    exit 100; 
    } 
} 
+0

謝謝用$ e修改後它工作正常.. – Scg

0

您可以使用set來完成這些操作。我用非標準模塊Set::Scalar來幫我一下吧:

#!/usr/bin/env perl 

use warnings; 
use strict; 
use Set::Scalar; 

my @array = qw(MAJOR MINOR MM DD YY); 
my @exclude = qw(MM MINOR YY); 
my @include = qw(LICENSE VALID); 

my $array_set = Set::Scalar->new(@array); 
my $exclude_set = Set::Scalar->new(@exclude); 
my $include_set = Set::Scalar->new(@include); 

my $result = $array_set->difference($exclude_set)->union($include_set); 

use Data::Dumper; 

print Dumper @$result; 

運行它想:

perl script.pl 

國債收益率:

與grep的
$VAR1 = 'VALID'; 
$VAR2 = 'MAJOR'; 
$VAR3 = 'DD'; 
$VAR4 = 'LICENSE'; 
+0

它是可用的,有沒有什麼辦法使用標量操作來比較兩個數組。 – Scg

1

使用strict和warnings來提醒你很多perl陷阱。

散列是在perl中表示集合的最自然的方式。

use strict; 
use warnings; 
my @array = ('MAJOR','MINOR','MM','DD','YY'); 
my @exclude = ('MM','MINOR','YY'); 
my @include = ('LICENSE','VALID'); 

my %set; 
# add @array to set 
@set{@array} =(); 
# remove @exclude 
delete @set{@exclude}; 
# add @include 
@set{@include} =(); 
# array of elements resulting 
my @result = sort keys %set;