When using this, the thing you must watch out for are multivalued CGI parameters. Because a hash cannot distinguish between scalar and list context, multivalued parameters will be returned as a packed string, separated by the "\0" (null) character.
然而,事实证明,\0
在 Perl 中没有什么特别之处:
print length("test\0hi");
输出是:
7
而在 C 中它应该是 4
。
为什么 CGI.pm 仍然使用 \0
作为空字符,而它在 Perl 中被视为普通字符(不再是字符串结束标记)?
最佳答案
这是一个设计错误。我认为我们同意它根本不应该将哈希值强制转换为字符串,但在当时这似乎是个好主意,而 \0
只是出于各种无关紧要的原因而成为最不坏的选择.
编辑:人们通常避免将 NUL 准确地放入他们的数据中,因为它往往会导致 C 程序中断,因此这使得这个字符作为分隔符稍微更受欢迎。
编辑 2:hobbs comments它可以追溯到 Perl 4,所以错误不在最初的设计中,而是在继承它之后没有足够努力地弃用该功能。
好吧,事后诸葛亮总是完美的。 Hash::MultiValue是您想到的更智能的数据结构。
关于perl - 为什么 CGI.pm 仍然使用 "\0"作为空字符,而它在 Perl 中被视为普通字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7318929/