2010-01-08 24 views

Trả lời

30

Chỉ cần sao chép nó:

my %copy = %$hash; 

Nếu bạn muốn tham khảo khác, chỉ cần mở rộng tham khảo ban đầu trong các nhà xây dựng băm vô danh:

my $copy = { %$hash }; 

Đối với những thắc mắc về bản sao cạn: loại này phân chỉ tạo các giá trị mới cho các khóa cấp cao nhất. Bất kỳ giá trị nào là tham chiếu sẽ vẫn là cùng một tham chiếu trong băm mới. Tức là, bạn có thể thay thế một giá trị trong băm mới mà không thay đổi băm ban đầu. Nếu bạn chỉ thay đổi giá trị, chẳng hạn như đẩy một mục mới lên một giá trị mảng ẩn danh, cả hai hàm băm sẽ nhận được thay đổi vì chúng chia sẻ cùng một tham chiếu. Như vậy, bản sao nông thường không phải là những gì bạn muốn.

+1

Điều thú vị là, để tạo một bản sao ẩn danh của một băm được tham chiếu, cú pháp là '% {{% $ hash}}'. Tôi đã có nó như là '% {% $ hash}', mà làm việc (không có phần sao chép - nó trả về băm tham chiếu ban đầu, chứ không phải là một bản sao) trong Perl 5.8.8, nhưng thất bại trong 5.16 ... –

+0

thông báo rằng ' $ a = $ hash; 'là một bản sao của ref, nghĩa là tham chiếu chính xác, sau đó'% b =% $ hash; 'là một bản sao nông của hash (dereferenced), mặc dù'% b' không phải là tham chiếu, sau đó '$ c = {% $ hash}' wold là một tham chiếu đến bản sao nông được mở rộng bên trong một băm ẩn danh. Trong trường hợp bạn đề cập đến '% {{% $ hash}}' từ bên trong nhất, bạn sẽ mở rộng thành băm ẩn danh và cuối cùng là dereference rằng băm bên ngoài, nghĩa là nó không phải là một tham chiếu ở cuối. – arhak

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