2012-08-09 12 views
6
$a = {b=>{c=>1}}; # set up ref 
$b = $a->{b};  # ref the ref 
$b .= (d=>1,e=>1); # where we want to assign multiple key/val at once 

Pod koniec tego $a powinna wyglądać następująco:Perl: Jak wcisnąć klawisz/pary wartości na hashref i nadal zachowują Reference

  • { 
        'b' => { 
          'c' => 1, 
          'd' => 1, 
          'e' => 1 
         } 
    }; 
    

Pod koniec tego $b powinien wyglądać następująco:

  • { 
        'c' => 1, 
        'd' => 1, 
        'e' => 1 
    } 
    

Uwaga: byłoby takie samo, jak robi:

$b->{d} = 1; 
$b->{e} = 1; 

$b = { %$b, d=>1, e=>1 }; nie jest pożądane, ponieważ tworzy kopię $a i traci odniesienie.

Odpowiedz

8
%{$b} = (d => 1, e => 1); 

Po prostu odwołujesz się do anonimowego hash-ref, więc wygląda na mieszanie dla operatora przypisania.

Można nawet to zrobić:

%{$b} = (%{$b}, d => 1, e => 1); 

W tych przypadkach %{$b} jest po prostu naprawdę komfort wizualny (choć w niektórych przypadkach może być składniowym ujednoznacznienie) dla %$b.

... czy można zrobić ...

foreach (qw/ d e /) { 
    $b->{$_} = 1; 
} 

Oczywiście pewnie nie zamierza przypisać wartość „1” do wszystkiego. Tak jak o kawałek:

@{$b}{ qw/ d e/} = (1, 1); 

Plastry są omawiane w perldoc perldata, ale naprawdę nie jest dobry opis perldoc podejmowania kawałek anonimowej hash. W tym celu musisz zapoznać się ze wszystkimi dokumentami dotyczącymi Perla na podstawie odniesień, a następnie ekstrapolować, jak zastosować to do składni segmentów. ... lub sprawdź anonymous hash slices w PerlMonks.

+0

Tak, przed pytaniem spojrzałem na perldatę i nie mogłem znaleźć nic konkretnego - cieszę się, że udało ci się coś z tego odczytać. Szczerze mówiąc, jestem zaskoczony '% {$ b} = (% {$ b}, d => 1, e => 1);' pracował (że nadal stosował zmiany do odnośnika '$ a') – vol7ron

+0

Bit o plasterku hashrefa pomogło mi zrozumieć, że '->' nie jest potrzebne. Ponieważ '$ _' jest hashrefem, próbowałem' @ _-> {qw (key1 key2)} ', który generuje tajemniczy komunikat o błędzie:' Nie można użyć niezdefiniowanej wartości jako odwołania HASH' Działa to: '@ { $ _} {qw (key1 key2)} ' – Palec

+0

@Palec To może nie mieć żadnego wpływu na to, co robiłeś, ale w twoich przykładach' @ _' i '@ $ _' mają dwa różne znaczenia: – vol7ron

7

Użyj skrótu do skrótu.

@$b{"d","e"} = (1,1); 

%newdata = (d => 1, e => 1); 
@$b{keys %newdata} = values %newdata; 
+0

+1, Ahh hash plastry, oczywiście. Obydwie odpowiedzi były tym, czego potrzebowałem - wybrałem Dawida z powodu trzymania kluczy/valsów podczas wykonywania zadania w jednej linii. - Dzięki, mob – vol7ron