2013-09-26 75 views
11

Tôi có băm sau:Trong Perl, tại sao ghép một băm bằng một chuỗi cung cấp cho một kết quả phân đoạn?

my %villains = { 
    "Boba" => "Fett", 
    "Darth" => "Vader", 
    "Moff" => "Tarkin", 
} 

sau đó tôi in nó như vậy:

print "".%villains; 

tôi nhận được kết quả như sau:

1/8 

gì ngữ nghĩa trong Perl thực hiện điều này?

Cảm ơn bạn!

+6

Lưu ý rằng bạn đã gán một khóa ở đây với tham chiếu và không có giá trị. Đặt nội dung băm trong các dấu ngoặc nhọn ('{' và '}') được gán một tham chiếu _hash, không phải là một băm. Bạn khai báo một băm và cho nó một tham chiếu _hash_. Vì vậy, bạn sẽ không bao giờ nhận được nhiều hơn một xô đầy. –

+0

Đây là câu hỏi đầu tiên rất hay. Làm tốt! – simbabque

Trả lời

13

Bạn đang đánh giá băm trong ngữ cảnh vô hướng. Khi bạn thực hiện điều này, nó thực sự trả về một phần nhỏ số lượng nhóm được chạm vào tổng số nhóm, trừ khi băm không được sử dụng trong trường hợp nó được đánh giá là sai. Xem this perldoc để biết thêm thông tin (gần cuối phần).

4

If you evaluate a hash in scalar context, it returns false if the hash is empty. If there are any key/value pairs, it returns true; more precisely, the value returned is a string consisting of the number of used buckets and the number of allocated buckets, separated by a slash. This is pretty much useful only to find out whether Perl's internal hashing algorithm is performing poorly on your data set.

Điều này có thể sử dụng một số giải thích cho bất cứ ai không quen thuộc với internals băm: Khi mục được thêm vào một băm, họ đang sắp xếp thành xô dựa trên một thuật toán băm để họ có thể được lấy ra hơn hiệu quả.

Ví dụ

Bạn đang thu thập xe đồ chơi. Để tìm thấy chiếc xe của bạn một cách dễ dàng, bạn đã quyết định đặt chúng trong các thùng khác nhau dựa trên màu sắc. Bạn có xô cho Red, Vàng, Xanh, xanhĐen xe ô tô màu.

Bạn thêm một mới Xanh Ford Mustang vào bộ sưu tập của bạn để nó đi trong Xanh xô. Lần tới khi bạn muốn tìm chiếc xe này, bạn có thể truy cập trực tiếp vào nhóm Xanh và có lựa chọn nhỏ hơn để tìm kiếm.

Trong ví dụ này, bộ sưu tập xe hơi là hash, mỗi ô tô là hash entry và màu là hashing algorithm. Vì bộ sưu tập cũng chứa những chiếc xe màu đỏ, xanh dương và đen, chúng được bố trí khá hiệu quả, sử dụng 4/5 của các thùng.

Tuy nhiên, nếu bạn sử dụng hệ thống này cho bộ sưu tập xe màu đỏ, thuật toán băm sẽ rất kém hiệu quả. Nó sẽ chỉ sử dụng 1/5 của các thùng và tìm một chiếc xe cụ thể sẽ liên quan đến tìm kiếm thông qua toàn bộ bộ sưu tập.