将字符串分配给Perl substr?

将字符串分配给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 在这种情况下,

我正在查看其他人编写的Perl脚本,我发现:

$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