Если скаляр не магический и имеет строковый буфер, и строка помещается в строковый буфер, то эта часть строкового буфера будет перезаписана.
Обратите внимание, что
$s = "abcdef";
$s =~ s/...//;
$s = "x" x length($s);
оставляет "xxx \ 0ef \ 0" в буфере скаляра. Требуется длина буфера, а не длина строки внутри буфера.
Я хотел сказать, что ни один из
$s = undef;
$s = 123;
повлияет на строковый буфер вообще. Это даже не будет освобождено. Аналогично, присвоение строки скаляру не повлияет на другие поля скаляра, такие как поля для хранения чисел.
Я забыл, что если строка, присваиваемая скаляру, имеет значение TEMP
, буфер цели заменяется вместо перезаписи.
>perl -MDevel::Peek -e"my $s = 'abc'; Dump($s); $s = 'X' x length($s); Dump($s);"
SV = PV(0x348d54) at 0x1d3927c
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0x349fac "abc"\0
CUR = 3
LEN = 12
SV = PV(0x348d54) at 0x1d3927c
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0x349fac "XXX"\0 <-- same address
CUR = 3
LEN = 12
>perl -MDevel::Peek -e"my $s = 'abc'; Dump($s); $s = sub { 'X' x length($s); }->(); Dump($s);"
SV = PV(0x38d54) at 0x1c3930c
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0x39fac "abc"\0
CUR = 3
LEN = 12
SV = PV(0x38d54) at 0x1c3930c
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0x1c603fc "XXX"\0 <-- different address
CUR = 3 No overwriting.
LEN = 12