Perl:现实生活中的字符串长度限制

时间:2014-04-02 17:18:04

标签: string perl limit

虽然,例如,perldata文件表明Perl中的标量字符串仅受可用内存的限制,但我强烈怀疑在现实生活中会有其他一些限制。

我考虑了以下想法:

  • 我不确定如何在Perl中实现字符串 - 是否存在某种字节/字符计数器?如果存在,则可能将其实现为依赖于平台的整数(即32位或64位),因此有效地将字符串限制为2 ** 312 ** 322 ** 632 ** 64字节。
  • 如果Perl没有使用计数器而是使用一些字节来终止字符串(这会很奇怪,因为它有一个像#34; foo \ 0bar&#34这样的字符串是完全可以的。 ;在Perl中),随着字符串长度的增加,所有操作都将不可避免地变慢。
  • Perl处理字符串的大多数字符串函数(例如length)返回正常的标量整数,我强烈怀疑它也是平台限制的整数。

那么,在现实生活中限制Perl字符串长度的其他因素是什么?出于实际目的,应该考虑一个好的字符串长度?

1 个答案:

答案 0 :(得分:14)

它跟踪缓冲区的大小和其中的字节数。

$ perl -MDevel::Peek -e'$x="abcdefghij"; Dump($x);'
SV = PV(0x9222b00) at 0x9222678
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x9238220 "abcdefghij"\0
  CUR = 10                        <-- 10 bytes used
  LEN = 12                        <-- 12 bytes allocated
  • 在32位构建的Perl上,它对这些值使用32位无符号整数。这(确切地)足够大,可以创建一个字符串,用于占用您的进程的整个4 GiB地址空间。

  • 在64位版本的Perl上,它对这些值使用64位无符号整数。这(足够大)足以创建一个字符串,该字符串会耗尽您的流程的整个16 EiB地址空间。

文档是正确的。字符串的大小仅受可用内存的限制。