Как объединить два массива без дубликатов - PullRequest
4 голосов
/ 15 июля 2010
@tools = ("hammer", "chisel", "screwdriver", "boltcutter",
           "tape", "punch", "pliers"); 
@fretools =("hammer", "chisel", "screwdriver" ,"blade");

push @tools,@fretools if grep @tools,@fretools

и у меня есть инструменты

  @tools=("hammer", "chisel", "screwdriver", "boltcutter", 
       "tape", "punch", "pliers", "blade");

Есть ли простой способ сделать?

Ответы [ 3 ]

9 голосов
/ 15 июля 2010

Модуль List :: MoreUtils CPAN имеет для этого функцию uniq. Если вы не хотите полагаться на установку этого модуля, вы можете просто скопировать функцию uniq из исходного кода модуля (поскольку это чистый Perl) и вставить ее непосредственно в свой собственный код (с соответствующими подтверждениями). В общем, преимущество использования кода из CPAN заключается в том, что его поведение задокументировано и хорошо протестировано.

use strict;
use warnings;
use Data::Dumper;

sub uniq (@) {
    # From CPAN List::MoreUtils, version 0.22
    my %h;
    map { $h{$_}++ == 0 ? $_ : () } @_;
}

my @tools = ("hammer", "chisel", "screwdriver", "boltcutter",
             "tape", "punch", "pliers"); 
my @fretools =("hammer", "chisel", "screwdriver" ,"blade");
@tools = uniq(@tools, @fretools);
print Dumper(\@tools);

__END__

$VAR1 = [
          'hammer',
          'chisel',
          'screwdriver',
          'boltcutter',
          'tape',
          'punch',
          'pliers',
          'blade'
        ];
4 голосов
/ 15 июля 2010

Обязательно найдется модуль, который сделает это за вас, НО без модуля:

my %uniques;
@uniques{@tools} = @tools x (1);
@uniques{@fretools} = @fretools x (1);
@tools = sort keys %uniques;

Это ставит инструменты в другой порядок.Если вы хотите сохранить заказ, вам нужен другой метод.

my %uniques;
@uniques{@tools} = @tools x (1);
for (@fretools) {
    push @tools, $_ if ! $uniques{$_};
}
1 голос
/ 15 июля 2010

Вы можете попробовать использовать хеш, а затем извлечь ключи, чтобы получить уникальные элементы:

use strict; 

my @tools = ("hammer", "chisel", "screwdriver", "boltcutter", "tape", "punch", "pliers");  
my @fretools =("hammer", "chisel", "screwdriver" ,"blade"); 

push @tools,@fretools if grep @tools,@fretools;

my %hash   = map { $_, 1 } @tools;
my @array = keys %hash;

print "@array";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...