当我对一个字符串进行连接操作时,背后会发生什么?
my $short = 'short';
$short .= 'cake';
Perl是否实际上创建了一个新字符串,然后将正确的变量引用分配给它,还是Perl字符串天生可变?
这个问题的动机来自我与同事的讨论,他说脚本语言可以利用不可变字符串。
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
请注意,第三种情况下不会分配新的缓冲区。Perl字符串肯定是可变的。除了使用长度和开始偏移量外,每个字符串都将存储分配的缓冲区大小,并且缓冲区将根据需要进行扩展。(开始偏移量对于允许像s/^abc//这样的消耗性操作不必移动实际数据非常有用。)
perldoc
中是否有对此的硬引用? - Zaid$short = 'short';
print \$short;
$short .= 'cake';
print \$short;
perldoc
中有任何可靠的参考资料,将不胜感激。 - Zaidperldoc perlguts
并在SvGROW
附近寻找。否则,@eugene 的回答就是你要找的。 - Dummy00001perlfunc
文档中的substr
(作为lvalue和4个参数调用)描述了修改字符串本身的操作:增长、缩小和替换部分。 - pilcrow