2013-06-13 50 views
5

Làm thế nào tôi có thể đặt một mảng (như tuple trong ví dụ sau) vào một băm trong Perl?Tạo một hàm băm Perl với một mảng làm khóa

%h=(); 
@a=(1,1); 
$h{@a}=1 or $h{\@a}=1?? 

Tôi đã thử với tham chiếu mảng, nhưng nó không hoạt động. Làm thế nào để làm cho nó hoạt động? Tôi muốn cơ bản de-trùng lặp bằng cách làm băm (trong số những thứ khác với điều này).

+0

bạn sẽ cần phải đưa ra thuật toán băm của riêng bạn cho mảng của bạn, và sau đó sử dụng nó làm chìa khóa của bạn. –

+0

bạn có thể cho một ví dụ được không? –

+0

Điều này là không thể: Tất cả các khóa phải là chuỗi. Tuy nhiên, bạn có thể tham gia các phần của mảng để tạo thành một khóa có ký tự mà bạn có thể đảm bảo sẽ không xuất hiện trong các giá trị. Đây có thể là một byte NUL: '$ h {join" \ x00 ", @a} = 1'. – amon

Trả lời

9

Các băm thông thường chỉ có thể có các khóa chuỗi, vì vậy bạn cần phải tạo một số chức năng băm cho các mảng của mình. Một cách đơn giản sẽ chỉ đơn giản là join yếu tố mảng của bạn, ví dụ:

$h{join('-', @a)} = \@a; # A nice readable separator 
$h{join($;, @a)} = \@a; # A less likely, configurable separator ("\034") 

Nhưng cách tiếp cận đó (sử dụng giá trị sentinel) yêu cầu bạn chọn ký tự không được tìm thấy trong khóa. Những điều sau đây không gặp vấn đề đó:

$h{pack('(j/a*)*', @a)} = \@a; 

Hoặc, hãy xem Hash::MultiKey có thể mất một khóa phức tạp hơn.

+0

Tôi đã thêm một vài chi tiết khác. Tôi hy vọng bạn không nhớ. – ikegami

3

Tôi đã thử với tài liệu tham khảo mảng, nhưng nó không hoạt động

vui rằng, trang 361 của (mới) Camel cuốn sách có tiêu đề đoạn: Tài liệu tham khảo không làm việc như Hash Phím

Vì vậy, có, bạn đã chứng minh đúng cuốn sách Camel. Sau đó nó tiếp tục cho bạn biết làm thế nào để sửa chữa nó, sử dụng Tie::RefHash.

Tôi đoán bạn nên mua sách.

(Nhân tiện, (1,1) có thể được gọi là một bộ trong Python, nhưng nó được gọi là danh sách trong Perl).

1

Để loại bỏ bản sao trong mảng bằng cách sử dụng bảng băm:

my %hash; 
@hash{@array} = @array; 
my @unique = keys %hash; 

Ngoài ra, bạn có thể sử dụng map để tạo ra băm:

my %hash = map {$_ => 1} @array; 
+0

-1: Không giải quyết sự không có khả năng của OP để sử dụng giá trị không vô hướng dưới dạng khóa băm. –

+0

Tôi cầu xin sự khác biệt. Nó đề cập đến câu hỏi thực sự của anh ấy (ở cuối bài viết), đó là sử dụng một hàm băm để trích xuất một mảng. Điều đó gợi ý với tôi rằng những gì anh ta đang cố gắng đạt được bằng cách thiết lập một mảng như một băm là gán cho mỗi phần tử trong mảng như một khóa riêng biệt trong băm. – stevenl

+0

Đồng ý rằng nó cho thấy làm thế nào để dedup một tập dữ liệu bằng cách sử dụng một băm, nhưng đọc của tôi về câu hỏi là các yếu tố dữ liệu trong bộ là tuple, không phải là các yếu tố của mỗi tuple. Vì vậy, nếu anh ta không thể sử dụng các bộ dữ liệu như là chìa khóa, thì việc sử dụng các phím 'để loại trừ là không thể. Có lẽ OP có thể làm rõ chính xác những gì anh ta deduping? –

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