2010-07-15 60 views
4
@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"); 

有沒有什麼簡單的方法呢?

+1

所以,你想,沒有任何重複合併兩個數組? – 2010-07-15 13:43:28

+0

YES ..請不要在這裏尋找一些外部模塊 – Tree 2010-07-15 13:44:57

+0

my @ employees1 =(「Fred Flintstone」,「Barny Rubble」,「Dino Fintstone」); my @ employees2 =(「Wilma Flintson」,「Bamm-Bamm」,「Jigglypuff」); my @allemployees =(@ employees1,@ employees2); (可能是這個)? – Tree 2010-07-15 13:47:19

回答

9

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

+1更加緊湊的變體:'map {$ h {$ _} ++? ():$ _} @ _'。 – FMc 2010-07-15 14:18:54

4

有肯定是一個模塊,可以實現這個要求,但沒有一個模塊:

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

你可以嘗試使用哈希,然後提取鍵以獲得獨特的元素:

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";