子膨胀、偏移、长度、更换
子EXPR、OFFSET、LENGTH
子EXPR,OFFSET

从EXPR中提取一个子字符串并返回它。第一个字符位于偏移量零处。如果OFFSET为负数,则从字符串末尾开始。如果省略了LENGTH,则返回字符串末尾的所有内容。如果LENGTHs为负值,则保留字符串末尾的许多字符。

my$s=“黑猫爬上了绿树”;my$color=子$s,4,5;#黑色my$middle=子$s,4,-11;#黑猫爬上了my$end=子$s,14;#爬上了那棵绿树my$tail=子$s,-4;#my$z=子$s,-4,2;#信托收据

您可以使用子(substr)函数作为左值,在这种情况下,EXPR本身必须是左值。如果指定的长度小于LENGTH,字符串将缩小,如果指定的值大于LENGTHs,字符串将增长以适应它。要保持字符串的长度不变,可能需要使用把格式数据写成串.

如果OFFSET和LENGTH指定的子字符串部分位于字符串之外,则只返回字符串中的部分。如果子字符串超出字符串的任一端,子(substr)返回未定义的值并生成警告。当用作左值时,指定完全位于字符串外部的子字符串会引发异常。下面是一个显示边界情况行为的示例:

my$name='fred';substr($name,4)=“dy”;#$名字现在是“弗雷迪”my$null=子$name,6,2;#返回“”(无警告)my$oops=子$name,7;#返回undef,带警告substr($name,7)=“间隙”;#引发异常

替代使用子(substr)作为左值,将REPLACEMENT字符串指定为第四个参数。这允许您更换EXPR的部分,并在一次操作中返回以前的内容,就像您可以使用剪接.

my$s=“黑猫爬上了绿树”;my$z=substr$s,14,7,“跳自”;#攀爬#$s现在是“黑猫从绿树上跳下”

注意,三参数版本的子(substr)充当“魔法子弹”;每次分配给它时,它都会记住原始字符串的哪个部分正在被修改;例如:

我的$x=“1234”;for(子项($x,1,2)){$_=“a”;打印$x,“\n”;#打印1a4$_=“xyz”;打印$x,“\n”;#打印1xyz4$x=“56789”;$_=‘pq’;打印$x,“\n”;#打印5pq9}

使用负偏移,当修改目标字符串时,它会记住从字符串末尾算起的位置:

我的$x=“1234”;for(substr($x,-3,2)){$_=“a”;打印$x,“\n”;#打印1a4,如上所示$x=“abcdefg”;打印$_,“\n”;#打印f}

在Perl版本5.10之前,多次使用左值的结果是未指定的。在5.16之前,未指定负偏移的结果。