Làm thế nào tôi có thể bình thường hóa một danh sách các đối số hàm thành một chuỗi, sao cho hai danh sách đối số chuyển đổi thành cùng một chuỗi iff chúng có hiệu quả tương đương? Thuật toán nênLàm thế nào để chuẩn hóa các đối số hàm Perl để ghi nhớ?
- Hãy so sánh băm nhúng và danh sách sâu sắc, chứ không phải bằng cách tham khảo
- Bỏ qua băm để chìa khóa
- Bỏ qua sự khác biệt giữa 3 và "3"
- Tạo một chuỗi tương đối dễ đọc (không bắt buộc, nhưng đẹp-to-có cho gỡ lỗi)
- Thực hiện tốt (XS ưa thích hơn Perl)
này là cần thiết cho memoization, tức là lưu vào bộ nhớ đệm kết quả của hàm dựa trên các đối số của nó.
Như một ví dụ strawman, Memoize sử dụng điều này như một normalizer mặc định, mà thất bại # 1 và # 3:
$argstr = join chr(28),@_;
Trong một thời gian tôi đi đến normalizer là
JSON::XS->new->utf8->canonical
Tuy nhiên nó xử lý số 3 và chuỗi "3" differently, dựa trên cách sử dụng vô hướng gần đây. Điều này có thể tạo ra các chuỗi khác nhau cho các danh sách đối số cơ bản tương đương và giảm lợi ích ghi nhớ. (. Phần lớn các chức năng sẽ không biết hoặc quan tâm nếu họ nhận được 3 hoặc "3")
Đối với niềm vui Tôi nhìn một loạt các serializers để xem cái nào phân biệt 3 và "3":
Data::Dump : equal - [3] vs [3]
Data::Dumper : not equal - [3] vs ['3']
FreezeThaw : equal - FrT;@1|@1|$1|3 vs FrT;@1|@1|$1|3
JSON::PP : not equal - [3] vs ["3"]
JSON::XS : not equal - [3] vs ["3"]
Storable : not equal - <unprintable>
YAML : equal - ---\n- 3\n vs ---\n- 3\n
YAML::Syck : equal - --- \n- 3\n vs --- \n- 3\n
YAML::XS : not equal - ---\n- 3\n vs ---\n- '3'\n
Trong số những báo cáo "bằng", không chắc chắn cách làm cho chúng bỏ qua thứ tự khóa băm.
Tôi có thể đi trước danh sách đối số trước và xâu chuỗi tất cả các số, nhưng điều này sẽ yêu cầu tạo bản sao sâu và vi phạm # 5.
Cảm ơn!
Ngoài ra còn có [Test :: More] (http://metacpan.org/module/Test::More) 's is_deeply và [Test :: Deep] (http://metacpan.org/module/Test :: Deep) của eq_deeply. – Ether