2012-02-21 26 views
10

Tôi nhận thấy rằng việc đánh giá một mảng trong Perl trong ngữ cảnh vô hướng rất hữu ích: nó dẫn đến một phần tử.Lý do để đánh giá một băm trong Perl trong bối cảnh vô hướng là gì?

Nhưng việc sử dụng thực tế việc có thể đánh giá băm trong ngữ cảnh vô hướng là gì? ví dụ.

  • my $scalar_value = %hash;

  • scalar(%hash)

Theo như tôi hiểu, nó tạo ra một chuỗi như "3/4" đưa ra một số thông tin về các bên trong của băm mà dường như chỉ có ích để gỡ lỗi.

+0

Sự khác biệt là gì? –

+3

Một mảng là một biến với '@' sigil, một danh sách là một loạt các mục trong mã nguồn. trong mã này '@array = (1, 2, 3)', '(1, 2, 3)' là một danh sách, và '@ array' là một biến mảng. perlfaq4 chứa nhiều thông tin hơn: http://perldoc.perl.org/perlfaq4.html#What-is-the-difference-between-a-list-and-an-array? –

+1

Nhưng tôi không thể viết 'vô hướng (1,2,3,4)'? nếu đó là trường hợp sau đó "danh sách" là chính xác dựa trên tuyên bố của bạn, không? –

Trả lời

14

Nó tạo ra giá trị có thể được sử dụng làm cờ TRUE/FALSE để biết giá trị băm có trống không (không có khóa).

Như một ví dụ:

if (%hash) { 
    print "Hash has elements\n"; 
} else { 
    print "Hash is empty\n"; 
} 

if buộc biểu thức vào một bối cảnh vô hướng vì việc sử dụng nó như một biểu thức boolean.

Đó là một khái niệm rất tương tự như sử dụng @array trong một bối cảnh vô hướng để kiểm tra sự trống rỗng:

if (@array) { 
    # NOT empty! 
} 
+0

Trường hợp "trống" có nghĩa là "không có khóa". – tchrist

+0

@tchrist - thêm rằng làm rõ, nhưng tôi đang ở một mất mát nhỏ như thế nào khác "băm rỗng" có thể được giải thích? – DVK

+3

Đó là nguyên nhân khiến mọi người trở nên kỳ quặc về việc liệu '% h = (foo => undef)' có nghĩa là một cái gì đó khác với một vô hướng. Tương tự như họ đi kỳ lạ trên '@a = (undef)'. Mỗi trong số đó có một chỉ mục hợp lệ, mặc dù không có giá trị hợp lệ. Vì vậy, đó là chìa khóa của nó mà đếm. – tchrist

1

Các vô hướng (% hash) cho phép bạn kiểm tra xem các thuật toán băm đang làm việc một cách chính xác. Nếu bạn có 1.000 phím và bạn thấy một cái gì đó như 2/16 có nghĩa là tất cả các phím được giải quyết chỉ có 2 trong số 16 nhóm được phân bổ. Điều này có nghĩa là tất cả các khóa của bạn rất giống nhau và gây ra nhiều va chạm, dẫn đến các tìm kiếm tuần tự trong nhóm.

đếm Mặc định xô là 8

perl -le '$h{a}=1;print scalar %h' 
1/8 

Prestash băm với 1000 xô (với sức mạnh khu vực gần 2)

perl -le 'keys(%h) = 1000;$h{a}=1;print scalar %h' 
1/1024 

Điều này cũng giúp ra khi bạn chúc phúc cho một băm cho perl OO. Bạn có thể tăng tốc mọi thứ nếu bạn biết sẽ có nhiều phím.

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