为什么CGI.pm仍然使用"\ 0"作为空字符,当它被视为Perl中的普通字符时?

Je *_*Rog 2 perl

引用自CGI.pm文档:

使用它时,你必须注意的是多值CGI参数.因为哈希不能区分标量和列表上下文,所以多值参数将作为打包字符串返回,由"\ 0"(空)字符分隔.

然而,事实证明,\0在Perl中没有什么特别之处:

print length("test\0hi");
Run Code Online (Sandbox Code Playgroud)

输出是:

7
Run Code Online (Sandbox Code Playgroud)

而在C中它应该是4.

为什么CGI.pm \0在Perl中被视为普通字符(不再是字符串结尾的标记)时仍然使用空字符?

dax*_*xim 7

这是一个设计错误.我认为我们同意它不应该将哈希值强制转换为字符串,但它可能在当时看起来是一个好主意,并且\0由于各种不重要的原因,它们是最不好的选择.

编辑:人们通常会避免将NUL精确地放入他们的数据中,因为它往往会导致C程序中断,因此这使得这个角色稍微更有利于分隔符.

编辑2:hobbs评论它可以追溯到Perl 4,所以错误不是在原始设计中,而是在执行它然后没有努力去弃用该功能.

事后来说,事后总是很完美.Hash :: MultiValue是您正在考虑的更智能的数据结构.