Jak mogę dodać skrót do hasza w języku Perl bez użycia pętli?Jak mogę połączyć dwa hasze w Perlu bez użycia pętli?
Odpowiedz
Jeśli masz na myśli wziąć unię swoich danych, wystarczy zrobić:
%c = (%a, %b);
Dlaczego% a = (% a,% b); praca? % a zostaje "skasowany" – biznez
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
@yskhoo: to działa. – ysth
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.
Dodatkowy kredyt, z hash ref w aib, robimy @ {$ a} {keys% $ b} = wartości% $ b; – daotoad
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
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
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;
}
my %c = %a;
map {$c{$_} = $b{$_}} keys %b;
Dlaczego nie chcesz użyć pętli? –