2014-01-23 207 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;