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

Gre*_*Cat 7 string perl limit

例如,Perldata文档中Perl中的标量字符串仅受可用内存的限制,但我强烈怀疑在现实生活中会有一些其他限制.

我正在考虑以下想法:

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

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

ike*_*ami 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
Run Code Online (Sandbox Code Playgroud)
  • 在32位构建的Perl上,它对这些值使用32位无符号整数.这(足够大)足以创建一个字符串,用于占用进程的整个4 GiB地址空间.

  • 在64位版本的Perl上,它对这些值使用64位无符号整数.这(确切地)足够大,可以创建一个字符串,用于占用进程的整个16 EiB地址空间.

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

  • 请注意我的答案中任何地方都没有word平台.如果您在32位环境中运行程序,那么如果您拥有64位平台则无关紧要.如果在64位平台上运行32位版本,则32位整数仍然足够大,可以解决所有进程的4GB地址空间.字符串的大小仅受可用内存的限制:4GB,减去操作系统保留的内存,减去已经用完的内存. (4认同)