perl - 为什么 CGI.pm 仍然使用 "\0"作为空字符,而它在 Perl 中被视为普通字符?

标签 perl

引自in the CGI.pm docs :

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/

相关文章:

perl - 如何制作默认使用 $_ 的 Perl 函数?

Perl命令行输入参数

r - 合并列,但它进入 perl 代码中的新行

perl - 将 Perl 的映射与自定义函数一起使用

perl - 如何将两个数组和一个字符串传递给 Perl 子例程?

perl - 如何在我的 iPhone 3GS 上获得 perl?

Perl 建议 - 接收文件并更改内容

regex - 使用 grep 或类似的方法来匹配多行

mysql - 如何在 MySQL 中查询包含亚洲语言字符的文本?

xml - 如何从 XML::Simple::XMLout 压缩 XML?