Документированный синтаксис оператора 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
1-й аргумент оцениваетсяв скалярном контексте. substr
2-й аргумент оценивается в скалярном контексте. substr
3-й аргумент (необязательно) оценивается в скалярном контексте.
@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)