代码之家  ›  专栏  ›  技术社区  ›  Zaid

Perl字符串是不可变的吗?

  •  16
  • Zaid  · 技术社区  · 15 年前

    当我对一个字符串进行连接时,幕后发生了什么?

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

    Perl是否有效地创建了一个新字符串,然后为其分配了正确的变量引用,或者Perl字符串在本质上总是可变的?

    这个问题的动机来自于我和一位同事的讨论,他说脚本语言可以利用不可变的字符串。

    3 回复  |  直到 15 年前
        1
  •  20
  •   Eugene Yarmash    15 年前

    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
  •  12
  •   ysth    15 年前

        3
  •  0
  •   hlynur    15 年前
    $short = 'short';
    print \$short;
    
    $short .= 'cake';
    print \$short;
    

    执行此代码后,我得到“SCALAR(0x955f468)SCALAR(0x955f468)”。我的答案是“可变的”。