Jak mogę znormalizować listę argumentów funkcji do łańcucha, tak, że dwie listy argumentów są konwertowane na ten sam ciąg, ponieważ są one faktycznie równoważne? Algorytm powinienJak znormalizować argumenty funkcji Perla do zapamiętania?
- Porównaj osadzonych mieszań i list głęboko, raczej niż przez odniesienie
- Ignoruj hash kolejność kluczy
- Ignoruj różnicę między 3 a „3”
- generować stosunkowo czytelny ciąg (nie jest wymagany, ale ładne-to-mieć do debugowania)
- Wykonaj dobrze (xs preferowanego przez Perl)
jest to konieczne dla memoization, tj. Buforowanie wyniku funkcji na podstawie jej argumentów.
Jako Strawman przykład Memoize wykorzystuje to jako domyślny normalizer, która nie # 1 i # 3:
$argstr = join chr(28),@_;
na chwilę moim iść do normalizer był
JSON::XS->new->utf8->canonical
jednak traktuje liczbę 3 i ciąg "3" differently, w oparciu o ostatnio używany skalar. Może to generować różne ciągi dla zasadniczo równoważnych list argumentów i zmniejszać korzyści z zapisu. (. Zdecydowana większość funkcji nie będzie wiedział, czy obchodzi czy oni dostać 3 lub „3”)
dla zabawy Spojrzałem na pęczek serializers aby przekonać się, które różnicują 3 i „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
Z tych, które zgłaszają "równy", nie wiesz, jak zmusić ich do zignorowania kolejności haszowania.
Mógłbym przejrzeć listę argumentów z wyprzedzeniem i powiązać wszystkie numery, ale wymagałoby to wykonania głębokiej kopii i naruszenia 5.
Dzięki!
Istnieje również [Test :: Więcej] (http://metacpan.org/module/Test::Więcej), a jest_deeply, i [Test :: Deep] (http://metacpan.org/module/Test :: Deep) - eq_deeply. – Ether