Как я могу найти элементы, которые находятся в одном массиве, но не в другом в Perl? - PullRequest
7 голосов
/ 16 июля 2011

У меня есть два массива, и я хочу найти элементы, которые находятся в одном массиве, но не в другом:

ex:

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

Мне нужно получить:1007 *

Ответы [ 6 ]

16 голосов
/ 16 июля 2011

Поместите элементы второго массива в хеш для эффективной проверки, чтобы увидеть, был ли в нем конкретный элемент, затем отфильтруйте первый массив только для тех элементов, которые не были во втором массиве:1002 *

2 голосов
/ 16 июля 2011
my @array3;
foreach my $elem ( @array1 )
{
    if( !grep( $elem eq $_, @array2 ) )
    {
        push( @array3, $elem );
    }
}
1 голос
/ 06 сентября 2014

Использовать хеш в качестве справочной таблицы.Его ключи являются элементами второго массива, значения не имеют значения:

#!/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";

Подробнее см. Рецепт 4.8 в Кулинарная книга Perl .

1 голос
/ 17 июля 2013

Вы можете использовать модуль cpan с именем List :: Compare .

use List::Compare;
    my $lc = List::Compare->new(\@array1,\@array2);
    my @newarray = $lc->get_symdiff;
0 голосов
/ 16 июля 2011
my %total;
$total{$_} = 1 for @array1; 
delete $total{$_} for @array2; 
my @diff = keys %total;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...