2010-02-23 35 views
9

Nói rằng tôi có một cái gì đó như:Làm cách nào để tạo một tham chiếu băm mới, trống trong Perl?

# %superhash is some predefined hash with more than 0 keys; 
%hash =(); 
foreach my $key (keys %superhash){ 
    $superhash{ $key } = %hash; 
    %hash =(); 
} 

Sẽ tất cả các phím của điểm superhash để băm rỗng cùng truy cập bởi %hash hoặc họ sẽ băm trống khác nhau?

Nếu không, làm cách nào để đảm bảo chúng trỏ đến băm rỗng?

+0

@toolic lời xin lỗi của tôi. Mã thực tế tôi đã có một chút quá phức tạp để đăng bài, vì vậy tôi viết lại nó cho câu hỏi. –

Trả lời

16

Bạn cần sử dụng toán tử \ để tham chiếu đến loại dữ liệu số nhiều (mảng hoặc băm) trước khi bạn có thể lưu trữ nó vào một khe đơn lẻ. Nhưng trong mã ví dụ được đưa ra, nếu được tham chiếu, mỗi mã sẽ là cùng một giá trị băm.

Cách để khởi tạo cấu trúc dữ liệu của bạn là:

foreach my $key (keys %superhash) { 
    $superhash{ $key } = {}; # New empty hash reference 
} 

Nhưng khởi như thế này phần lớn là không cần thiết trong Perl do autovivification (tạo các đối tượng chứa thích hợp khi một biến được sử dụng như một container).

my %hash; 

$hash{a}{b} = 1; 

Bây giờ %hash có một chìa khóa, 'a', trong đó có một giá trị của một hashref nặc danh, chứa cặp khóa/giá trị b => 1. Mảng tự động hóa theo cách tương tự.

+0

Đồng ý. Không cần phải mang thêm băm xung quanh khi Perl không cần. – Zaid

+0

Tôi làm cách nào để truy cập các khóa của $ hash {a}? Khi tôi cố gắng 'foreach $ rk của tôi (khóa $ hash {a}) {...' nó cho tôi một lỗi: loại phải là băm –

+0

Ah tôi đã nhận nó: '$ deref = $ hash {a}' và sau đó 'foreach $ key (phím% $ deref) {...' –

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