Действительно ли строки Perl неизменны?

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

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

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

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

16
задан Zaid 3 August 2010 в 13:41
поделиться

3 ответа

Строки 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

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

20
ответ дан 30 November 2019 в 17:26
поделиться
$short = 'short';
print \$short;

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

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

0
ответ дан 30 November 2019 в 17:26
поделиться

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

12
ответ дан 30 November 2019 в 17:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: