2012-08-09 29 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 

hashref üzerine anahtarı/değer çifti itmek ve hala muhafaza Nasıl $a gibi görünmelidir

  • { 
        'c' => 1, 
        'd' => 1, 
        'e' => 1 
    } 
    
  • 01: gibi görünmelidir

Not: yaptığını aynı olacaktır: o $a bir kopyasını oluşturur ve başvuru kaybeder çünkü

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

$b = { %$b, d=>1, e=>1 }; arzu değil mi.

cevap

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

Anonim hash-ref dosyasını yalnızca referans olarak kullanabilirsiniz, böylece atama işlecine bir karma gibi görünecektir.

Hatta yapabilirsiniz: %$b için (bazı durumlarda bir sözdizimsel anlam ayrım olabilir ama) Bu durumlarda %{$b} yılında

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

sadece gerçekten görsel bir kolaylık.

... ya da yapabilirdi ...

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

Açıkçası muhtemelen her şeyi '1' değerini atamak isteyen değiliz. Peki bir dilim hakkında:

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

Dilimler perldoc perldata tartışılmaktadır, ancak anonim bir karma bir dilim alarak iyi perldoc açıklama gerçekten yok. Bunun için referanslardaki tüm Perl belgelerine başvurmanız ve sonra sözdizimini dilimlemek için nasıl uygulayacağınızı tahmin etmeniz gerekir. ... ya da PerlMonks'ta anonymous hash slices'u kontrol edin.

+0

Evet Sormadan önce perldata'ya baktım ve özel bir şey bulamadım - ondan bir şeyler çözebildiğine sevindim. Açıkçası, ben şaşırdım '% {$ b} = (% {$ b}, d => 1, e => 1);' çalıştı (yine de başvurulan '$ a' için değişiklikler uygulandı) – vol7ron

+0

hashref dilimi hakkında, '->' nin gerekli olmadığının farkına vardım. '$ _' bir hashref ile, ben bir şifreli hata mesajı üreten '_-> {qw (key1 key2)}' yi denedim: 'HASH referansı olarak tanımsız bir değer kullanamazsınız' Bu çalışır:' @ { $ _} {qw (key1 key2)} ' – Palec

+0

@Palec Yaptığınız şey üzerinde herhangi bir yatak olmayabilir, ancak örneklerinizdeki' @ _' ve '@ $ _' iki farklı anlamları vardır – vol7ron

7

Karma dilimi gösterimini kullanın.

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

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

+ 1, Ahh hash dilimleri, elbette. Her iki cevap da ihtiyacım olan şeydi - David'leri anahtarlar/valları tek bir satırda ödev sırasında bir arada tuttukları için seçtim. - Teşekkürler, mafya – vol7ron

İlgili konular