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

Tại phần cuối của nó $a nên hình như:Perl: Làm thế nào để đẩy cặp khoá/giá trị lên hashref và vẫn giữ được tài liệu tham khảo

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

Tại phần cuối của nó $b sẽ trông giống như:

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

Lưu ý: nó sẽ được giống như thực hiện:

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

$b = { %$b, d=>1, e=>1 }; là không mong muốn vì nó tạo ra một bản sao của $a và mất tài liệu tham khảo.

Trả lời

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

Bạn chỉ cần bỏ tham chiếu hàm băm băm ẩn danh để nó trông giống như băm cho toán tử gán.

Bạn thậm chí có thể làm điều này:

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

Trong những trường hợp %{$b} chỉ là thực sự là một tiện nghi thị giác (mặc dù trong một số trường hợp có thể là một định hướng cú pháp) cho %$b.

... hoặc bạn có thể làm ...

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

Rõ ràng có lẽ bạn đang không có ý định gán giá trị của '1' để tất cả mọi thứ. Vậy làm thế nào về một lát:

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

Slices sẽ được thảo luận trong perldoc perldata, nhưng có không thực sự là một mô tả perldoc tốt tham gia một lát một băm nặc danh. Đối với điều đó, bạn phải đi đến các điều khoản với tất cả các tài liệu Perl về tài liệu tham khảo, và sau đó ngoại suy cách áp dụng điều đó cho cú pháp slice. ... hoặc kiểm tra anonymous hash slices tại PerlMonks.

+0

Vâng tôi đã nhìn vào perldata trước khi hỏi và tôi không thể tìm thấy bất kỳ điều gì cụ thể - tôi rất vui vì bạn đã có thể giải mã một cái gì đó từ nó. Thành thật mà nói, tôi ngạc nhiên '% {$ b} = (% {$ b}, d => 1, e => 1);' làm việc (nó vẫn áp dụng thay đổi cho tham chiếu '$ a') – vol7ron

+0

bit về hashref slice đã giúp tôi nhận ra rằng '->' là không cần thiết. Với '$ _' là một hashref, tôi đã thử' @ _-> {qw (key1 key2)} 'trong đó tạo ra một thông báo lỗi khó hiểu:' Không thể sử dụng một giá trị không xác định làm tham chiếu HASH' Công việc này: '@ { $ _} {qw (key1 key2)} ' – Palec

+0

@Palec Điều này có thể không có bất kỳ dấu hiệu nào về những gì bạn đang làm, nhưng trong ví dụ của bạn' @ _' và '@ $ _' có hai nghĩa khác nhau – vol7ron

7

Sử dụng ký hiệu băm lát.

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

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

+1, Ahh hash slices, tất nhiên. Cả hai câu trả lời là những gì tôi cần - tôi đã chọn David vì giữ chìa khóa/vals với nhau trong quá trình phân công tất cả trong một dòng. - Cảm ơn, mob – vol7ron

Các vấn đề liên quan