2009-08-06 31 views

Trả lời

30

Nếu bạn có nghĩa là mất đoàn dữ liệu của họ, chỉ cần làm:

%c = (%a, %b); 
+0

Tại sao không% a = (% a,% b); công việc? % a được "xóa" – biznez

+3

Nó hoạt động cho tôi: "% a = ('a' => 'b', 'c' => 1);% b = ('c' => 'd');% a = (% a,% b); in tham gia (',', bản đồ {"'$ _' => \" $ {a {$ _}} \ ""} phím% a), "\ n"; " Các mục từ% b với cùng một khóa được ưu tiên, nhưng các mục khác từ% a có mặt sau công đoàn. – outis

+4

@ ykhoo: nó hoạt động. – ysth

23

Bạn cũng có thể sử dụng lát sáp nhập một băm thành khác:

@a{keys %b} = values %b; 

Lưu ý rằng các mục trong% b sẽ ghi đè các mục trong% a có cùng khóa.

+5

Đối với tín dụng bổ sung, với giá trị băm trong a và b, chúng tôi thực hiện @ {$ a} {keys% $ b} = giá trị% $ b; – daotoad

+2

Tôi hy vọng điều này sẽ hiệu quả hơn so với trả lời khác, bởi vì một trong đó tái tạo băm cũng cho các mục đã tồn tại, trong khi điều này chỉ thêm các phím cho các mục mới. Nếu có nhiều mục trong% a, so với% b, sự khác biệt có thể đáng kính. – bart

+1

Có thể. Cách tiếp cận của tôi cũng đi% b hai lần. Nếu% b lớn hơn% a thì kỹ thuật kia có thể nhanh hơn. Nhanh nhất của tất cả có thể là một vòng lặp, nhưng OP không muốn điều đó. – outis

2

Điều này sẽ hợp nhất băm và cũng tính đến các mục không xác định, vì vậy chúng không thay thế nội dung.

my %hash = merge(\%hash1, \%hash2, \%hash3); 

sub merge { 
    my %result; 

    %result = %{ $_[0] }; 
    shift; 

    foreach my $ref (@_) { 
     for my $key (keys %{$ref}) { 
      if (defined $ref->{$key}) { 
       $result{$key} = $ref->{$key}; 
      } 
     } 
    } 

    return %result; 
} 
2
my %c = %a; 
map {$c{$_} = $b{$_}} keys %b; 
Các vấn đề liên quan