Perl substr(STRING,@ARRAY)ne substr(STRING,OFFSET,LENGTH)?

use*_*245 6 perl substr

为什么在Perl中:

@x=(0,2); 
substr('abcd',@x)
Run Code Online (Sandbox Code Playgroud)

评价为"cd"?

还有这个:

substr('abcd',0,2);
Run Code Online (Sandbox Code Playgroud)

评价为"ab"?

ike*_*ami 12

记录的substr运算符语法是

substr EXPR,OFFSET,LENGTH,REPLACEMENT
substr EXPR,OFFSET,LENGTH
substr EXPR,OFFSET
Run Code Online (Sandbox Code Playgroud)

不

substr EXPR,ARRAY
Run Code Online (Sandbox Code Playgroud)

或更通用的

substr EXPR,LIST
Run Code Online (Sandbox Code Playgroud)

这反映在输出中prototype(尽管你不能总是依赖于此).

$ perl -E'say prototype "CORE::substr"'
$$;$$
Run Code Online (Sandbox Code Playgroud)
  • substr第一个参数在标量上下文中进行评估.
  • substr第二个参数在标量上下文中进行评估.
  • substr第三个参数(可选)在标量上下文中进行评估.
  • substr第四个参数(可选)在标量上下文中进行评估.

@x在标量上下文中是它包含的元素数(2在本例中).

您可以使用以下方法实现您想要的目标:

sub mysubstr {
    if    (@_ == 2) { substr($_[0], $_[1]) }
    elsif (@_ == 3) { substr($_[0], $_[1], $_[2]) }
    elsif (@_ == 4) { substr($_[0], $_[1], $_[2], $_[3]) }
    else { die }
}

my @x = (0, 2);
mysubstr('abcd',@x)
Run Code Online (Sandbox Code Playgroud)


Sor*_*rin 5

substr有一个原型作为内置函数,所以@x未展开是在标量上下文中计算的,它返回2,所以基本上你调用substr('abcd',scalar(@x))


dgw*_*dgw 4

第一个在标量上下文中使用......意味着so@x的大小给出。@xsubstr('abcd',2)cd