为什么这是Perl:
@x=(0,2);
substr('abcd',@x)
评估为“cd”?
而且:
substr('abcd',0,2);
评价为“ab”?
答案 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
。