2009-08-06 36 views

Odpowiedz

30

Jeśli masz na myśli wziąć unię swoich danych, wystarczy zrobić:

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

Dlaczego% a = (% a,% b); praca? % a zostaje "skasowany" – biznez

+3

Działa on dla mnie: "% a = (" a "=>" b "," c "=> 1);% b = (" c "=>" d ");% a = (% a,% b); print join (',', map {"'$ _' => \" $ {a {$ _}} \ ""} keys% a), "\ n"; " Elementy z% b z tym samym kluczem mają pierwszeństwo, ale inne elementy z% a są obecne po unii. – outis

+4

@yskhoo: to działa. – ysth

23

Można również użyć plasterki scalić jeden skrót do drugiego:

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

Zauważ, że pozycje w% B, zastąpić elementy w% a, które mają ten sam klucz.

+5

Dodatkowy kredyt, z hash ref w aib, robimy @ {$ a} {keys% $ b} = wartości% $ b; – daotoad

+2

Oczekuję, że będzie to bardziej wydajne niż druga odpowiedź, ponieważ ta funkcja odtwarza hasz również dla już istniejących elementów, podczas gdy ta dodaje klucze dla nowych elementów. Jeśli było wiele elementów w% a, w porównaniu do% b, różnica może być godna szacunku. – bart

+1

Może. Moje podejście powoduje również dwukrotne przejście do% b. Jeśli% b jest większy niż% a, druga technika może być szybsza. Najszybciej ze wszystkich może być pętla, ale OP nie chciał tego. – outis

2

Spowoduje to połączenie skrótów, a także uwzględnienie niezdefiniowanych pozycji, aby nie zastępowały treści.

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; 
Powiązane problemy