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

时间:2012-01-26 20:16:17

标签: perl substr

为什么这是Perl:

@x=(0,2); 
substr('abcd',@x)

评估为“cd”?

而且:

substr('abcd',0,2);

评价为“ab”?

3 个答案:

答案 0 :(得分:13)

substr运算符的文档语法为

substr EXPR,OFFSET,LENGTH,REPLACEMENT
substr EXPR,OFFSET,LENGTH
substr EXPR,OFFSET

substr EXPR,ARRAY

或更通用的

substr EXPR,LIST

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

$ perl -E'say prototype "CORE::substr"'
$$;$$
  • 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)

答案 1 :(得分:5)

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

答案 2 :(得分:4)

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