Строки Perl неизменяемы?

Что происходит за кулисами, когда я выполняю конкатенацию в строке?

my $short = 'short';
$short .= 'cake';

Действительно ли Perl создает новую строку, а затем присваивает ей правильную ссылку на переменные или строки Perl всегда изменяются по своей природе?

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

Ответы

Ответ 1

Строки Perl являются изменяемыми. Perl автоматически создает новые буферы, если это необходимо.

use Devel::Peek;
my $short = 'short';

Dump($short);
Dump($short .= 'cake');
Dump($short = "");

SV = PV(0x28403038) at 0x284766f4
  REFCNT = 1
  FLAGS = (PADMY,POK,pPOK)
  PV = 0x28459078 "short"\0
  CUR = 5
  LEN = 8
SV = PV(0x28403038) at 0x284766f4
  REFCNT = 1
  FLAGS = (PADMY,POK,pPOK)
  PV = 0x28458120 "shortcake"\0
  CUR = 9
  LEN = 12
SV = PV(0x28403038) at 0x284766f4
  REFCNT = 1
  FLAGS = (PADMY,POK,pPOK)
  PV = 0x28458120 ""\0
  CUR = 0
  LEN = 12

Обратите внимание, что новый буфер не выделяется в третьем случае.

Ответ 2

Строки Perl определенно изменяемы. Каждый будет хранить выделенный размер буфера в дополнение к используемой длине и начальному смещению, и буфер будет расширяться по мере необходимости. (Начальное смещение полезно, чтобы позволить частым задачам, таким как s/^ abc//, не перемещать фактические данные.)

Ответ 3

$short = 'short';
print \$short;

$short .= 'cake';
print \$short;

После выполнения этого кода я получаю "SCALAR (0x955f468) SCALAR (0x955f468)". Мой ответ был бы "изменчивым".