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