将字符串分配给Perl substr?
我正在查看其他人编写的Perl脚本,我发现:将字符串分配给Perl substr?,perl,substr,Perl,Substr,我正在查看其他人编写的Perl脚本,我发现: $num2 = '000000'; substr($num2, length($num2)-length($num), length($num)) = $num; my $id_string = $text."_".$num2 请原谅我的无知,但是对于一个未经培训的Perl程序员来说,第二行看起来似乎是作者将字符串$num分配给函数substr的结果。这一行到底是做什么的?你认为它会做什么: $ perldoc -f substr 在这种情况下,
$num2 = '000000';
substr($num2, length($num2)-length($num), length($num)) = $num;
my $id_string = $text."_".$num2
请原谅我的无知,但是对于一个未经培训的Perl程序员来说,第二行看起来似乎是作者将字符串$num分配给函数substr的结果。这一行到底是做什么的?你认为它会做什么:
$ perldoc -f substr
在这种情况下,可以将substr函数用作左值
EXPR本身必须是左值。如果你分配一些短的
超过长度时,字符串将收缩,如果指定
超过长度的东西,绳子会长到
适应它。要保持字符串的长度不变,您可以
需要使用sprintf填充或切碎您的值
这正是你所认为的:
$ perldoc -f substr
在这种情况下,可以将substr函数用作左值
EXPR本身必须是左值。如果你分配一些短的
超过长度时,字符串将收缩,如果指定
超过长度的东西,绳子会长到
适应它。要保持字符串的长度不变,您可以
需要使用sprintf填充或切碎您的值
在我看来,它好像在用$num的内容覆盖$num2的最后一个长度$num字符,以获得一个“0”填充的数字
我想大多数人都会完成同样的任务,而sprintf在我看来,它就像是用$num的内容覆盖$num2的最后一个长度$num字符,以获得一个“0”填充的数字
我想大多数人都会用Perl来完成同样的任务,而不像Python那样,在Python中,字符串、元组不能就地修改,字符串可以就地修改。这就是substr在这里所做的,它只修改字符串的一部分。您可以使用更神秘的语法来代替此语法:
substr($num2, length($num2)-length($num), length($num),$num);
它完成了同样的事情。你可以进一步拉伸它。假设您想用一个字符串中的bar替换foo的所有实例,但只替换前50个字符。Perl将让您以一行程序完成:
substr($target,0,50) =~ s/foo/bar/g;
很好,不是吗?在Perl中,与Python不同,在Python中,字符串、元组不能就地修改,字符串可以就地修改。这就是substr在这里所做的,它只修改字符串的一部分。您可以使用更神秘的语法来代替此语法:
substr($num2, length($num2)-length($num), length($num),$num);
它完成了同样的事情。你可以进一步拉伸它。假设您想用一个字符串中的bar替换foo的所有实例,但只替换前50个字符。Perl将让您以一行程序完成:
substr($target,0,50) =~ s/foo/bar/g;
太好了,不是吗?没错,你问吧
通常,substr返回一个带POK的无聊字符串PV
$ perl -MDevel::Peek -e'$_="abcd"; Dump("".substr($_, 1, 2));'
SV = PV(0x99f2828) at 0x9a0de38
REFCNT = 1
FLAGS = (PADTMP,POK,pPOK)
PV = 0x9a12510 "bc"\0
CUR = 2
LEN = 12
然而,当substr在需要左值可赋值的地方求值时,它返回一个带有GMG get magic和SMG set magic的神奇标量PVLV
$ perl -MDevel::Peek -e'$_="abcd"; Dump(substr($_, 1, 2));'
SV = PVLV(0x8941b90) at 0x891f7d0
REFCNT = 1
FLAGS = (TEMP,GMG,SMG)
IV = 0
NV = 0
PV = 0
MAGIC = 0x8944900
MG_VIRTUAL = &PL_vtbl_substr
MG_TYPE = PERL_MAGIC_substr(x)
TYPE = x
TARGOFF = 1
TARGLEN = 2
TARG = 0x8948c18
FLAGS = 0
SV = PV(0x891d798) at 0x8948c18
REFCNT = 2
FLAGS = (POK,pPOK)
PV = 0x89340e0 "abcd"\0
CUR = 4
LEN = 12
这个神奇的标量保存传递给susbtr TARG、TARGOFF和TARGLEN的参数。您可以看到TARG指向的标量—传递给substr的原始标量在SV末尾重复,在底部看到0x8948c18
对这个神奇标量的任何读取都会导致调用一个关联函数。类似地,write调用不同的关联函数。这些函数导致读取或修改传递给substr的字符串的选定部分
perl -E'
$_ = "abcde";
my $ref = \substr($_, 1, 3); # $$ref is magical
say $$ref; # bcd
$$ref = '123';
say $_; # a123e
'
没错,你问
通常,substr返回一个带POK的无聊字符串PV
$ perl -MDevel::Peek -e'$_="abcd"; Dump("".substr($_, 1, 2));'
SV = PV(0x99f2828) at 0x9a0de38
REFCNT = 1
FLAGS = (PADTMP,POK,pPOK)
PV = 0x9a12510 "bc"\0
CUR = 2
LEN = 12
然而,当substr在需要左值可赋值的地方求值时,它返回一个带有GMG get magic和SMG set magic的神奇标量PVLV
$ perl -MDevel::Peek -e'$_="abcd"; Dump(substr($_, 1, 2));'
SV = PVLV(0x8941b90) at 0x891f7d0
REFCNT = 1
FLAGS = (TEMP,GMG,SMG)
IV = 0
NV = 0
PV = 0
MAGIC = 0x8944900
MG_VIRTUAL = &PL_vtbl_substr
MG_TYPE = PERL_MAGIC_substr(x)
TYPE = x
TARGOFF = 1
TARGLEN = 2
TARG = 0x8948c18
FLAGS = 0
SV = PV(0x891d798) at 0x8948c18
REFCNT = 2
FLAGS = (POK,pPOK)
PV = 0x89340e0 "abcd"\0
CUR = 4
LEN = 12
这个神奇的标量保存传递给susbtr TARG、TARGOFF和TARGLEN的参数。您可以看到TARG指向的标量—传递给substr的原始标量在SV末尾重复,在底部看到0x8948c18
对这个神奇标量的任何读取都会导致调用一个关联函数。类似地,write调用不同的关联函数。这些函数导致读取或修改传递给substr的字符串的选定部分
perl -E'
$_ = "abcde";
my $ref = \substr($_, 1, 3); # $$ref is magical
say $$ref; # bcd
$$ref = '123';
say $_; # a123e
'
您甚至可以使用负位置:substr$num2,-length$num,length$num,$num,num和既然substr一直延伸到末尾,它可以写为:substr$num2,-length$num=$num。只要知道length$num不是0,您甚至可以使用负位置:substr$num2,-length$num,length$num,$num和因为substr一直延伸到末尾,可以这样写:substr$num2,-length$num=$num。只要知道length$num不是0