如何規範化函數參數列表到一個字符串,以便兩個參數列表轉換爲相同的字符串iff它們實際上是等效的?該算法應該如何正常化記憶的Perl函數參數?
- 比較嵌入散列和列表深,而不是通過引用
- 忽略散列鍵順序
- 忽略3和「3」
- 產生相對可讀的字符串之間差(不是必需的,但好到有調試)
這是必要的表現良好(XS優於的Perl),即基於其參數緩存函數的結果。
作爲一個稻草人例如,Memoize使用此作爲默認正規化,從而未能#1和#3:
$argstr = join chr(28),@_;
有一段時間我去到正規化是
JSON::XS->new->utf8->canonical
然而,根據最近使用的標量的方式來處理數字3和字符串「3」differently。這可以爲基本上等價的參數列表生成不同的字符串,並降低記憶收益。 (絕大多數的功能將不知道或不關心,如果他們得到3或「3」)
爲了好玩,我看着一堆串行的,看看哪些區別3,「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
報告「相等」的人中,不知道如何讓他們忽略散列鍵序。
我可以提前走參數列表和字符串化所有的數字,但這需要作出深拷貝和違反#5。
謝謝!
還有[Test :: More](http://metacpan.org/module/Test::More)的is_deeply,和[Test :: Deep](http://metacpan.org/module/Test :: Deep)的eq_deeply。 – Ether