Perl: ограничения длины строки в реальной жизни

в то время как, например, perldata документы, скалярные строки в Perl ограничены только доступной памятью, я сильно подозреваю, что в реальной жизни будут некоторые другие ограничения.

Я рассматриваю следующие идеи:

  • Я не уверен, как строки реализованы в Perl - есть ли какой-то счетчик байтов/символов? Если есть, то, вероятно, он реализован как зависящее от платформы целое число( т. е. 32-разрядное или 64-разрядное), поэтому эффективно это ограничило бы строки чем-то вроде 2 ** 31, 2 ** 32, 2 ** 63 или 2 ** 64 байт.
  • если Perl не использует счетчик и вместо этого использует некоторый байт для завершения строки (что было бы странно, так как совершенно нормально иметь строку типа "foobar" в Perl), то все операции неизбежно будут намного медленнее по мере увеличения длины строки.
  • большинство строковых функций, которые Perl имеет дело со строками, такими как длина, например, вернуть нормальный скаляр integer, и я сильно подозреваю, что это будет целое число с ограниченной платформой.

Итак, каковы были бы другие факторы, ограничивающие длину строки Perl в реальной жизни? Что следует считать допустимой длиной строки для практических целей?

1 ответов


он отслеживает размер буфера и количество байтов в нем.

$ perl -MDevel::Peek -e'$x="abcdefghij"; Dump($x);'
SV = PV(0x9222b00) at 0x9222678
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x9238220 "abcdefghij"
  CUR = 10                        <-- 10 bytes used
  LEN = 12                        <-- 12 bytes allocated
  • в 32-разрядной сборке Perl для этих значений используется 32-разрядное целое число без знака. Это (точно) достаточно большой, чтобы создать строку, которая использует все адресное пространство вашего процесса 4 GiB.

  • в 64-разрядной сборке Perl для этих значений используется 64-разрядное целое число без знака. Это (точно) достаточно большой, чтобы создать строку, которая использует ваш процесс всего 16 EiB адресного пространства.

документы правильные. Размер строки ограничен только доступной памятью.