2014-01-23 6 views
1

У меня есть три набора (массивы) Мне нужно выполнить такую ​​операцию ((A-B)UC). У кого-нибудь есть логика этого в Perl? Вот мой код, я могу в состоянии проверить на это B подмножество A или нет, но я не мог в состоянии сделать «А-В»:Сравнение массивов и удаление массивов

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, что $_ во внешнем цикле переопределяется внутри блока 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 

Это дает:

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

Полезно, есть ли способ сравнить два массива с использованием скалярных операций. – Scg

1

используйте строгие предупреждения и предупреждения, чтобы предупредить вас о многих подводных камнях в 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;  
Смежные вопросы