2011-11-15 24 views
15

Tôi có một câu hỏi mà có vẻ cơ bản, nhưng tôi không thể tìm ra. Nói rằng tôi có một tham chiếu băm trong Perl. Tôi muốn nhận được một mảng các giá trị thông qua một mảng các khóa.Perl: Hash truy cập ref mảng của các phím

Sau đây là cách nó muốn làm việc với một băm, không phải là một tài liệu tham khảo băm:

my %testHash = ("a" => 1, "b" => 2, "c" => 3); 
my @testKeys = ("a", "b", "c"); 

my @testValues = @testHash{@testKeys}; 

Bây giờ giả sử tôi có một tham chiếu băm,

my $hashRef = {"a" => 1, "b" => 2, "c" => 3}; 

Tôi đã thử hai cách sau đây:

my @values = @{$hashRef->{@testKeys}}; 
my @values = $hashRef->{@testKeys}; 

Nhưng không đúng. Có một cách chính xác, hoặc tôi chỉ cần phải dereference băm ref mỗi khi tôi muốn làm điều này?

Trả lời

21

Bạn đang gần:

my @values = @$hashref{@testKeys};  ## (1) 

hoặc

my @values = @{$hashref}{@testKeys}; ## (2) 

Để biết thêm ví dụ, xem "Slices" in the perllol documentation.

"Using References" in the perlref documentation đưa ra các quy tắc chung.

1. Bất kỳ nơi nào bạn đặt số nhận dạng (hoặc chuỗi số nhận dạng) như một phần của tên biến hoặc chương trình con, bạn có thể thay thế mã định danh bằng biến vô hướng đơn giản chứa tham chiếu đúng loại.

Điều này giải thích tại sao (1) hoạt động: bạn đã thay thế số nhận dạng testHash bằng vô hướng đơn giản $hashRef.

2. Bất kỳ nơi nào bạn đặt một số nhận dạng (hoặc chuỗi số nhận dạng) như một phần của tên biến hoặc chương trình con, bạn có thể thay thế số nhận dạng bằng BLOCK trả về tham chiếu đúng loại.

Đoạn trích (2) ở trên gần giống nhau nhưng có cú pháp nhỏ hơn một chút. Thay cho số nhận dạng testHash, bạn viết một khối trả lại tham chiếu đến băm, tức là, {$hashRef}.

Các dấu ngoặc ở đây kèm theo một bona fide khối, vì vậy bạn có thể tính toán và trả về một tài liệu tham khảo, như trong

push @{ $cond ? \@a1 : \@a2 }, "some value"; 
+2

Trong trường hợp này, '@ $ hashref {}' @testKeys làm việc quá. Tôi đã từng thích '{}' niềng răng càng rõ ràng hơn, nhưng bây giờ tôi sẽ nghiêng về phía biến thể ít ồn ào hơn. – ephemient

+0

@ephemient Cảm ơn bạn đã giúp tôi cải thiện câu trả lời. –

+0

Ahh, tôi đoán tôi đã bị mắc kẹt bởi sự thiếu hiểu biết của tôi rằng mũi tên chỉ là một cách viết tắt thuận tiện. –

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