Почему это в Perl:Perl substr (STRING, @ARRAY) ne substr (STRING, OFFSET, LENGTH)?
@x=(0,2);
substr('abcd',@x)
оценивается как "CD"?
И это:
substr('abcd',0,2);
оценивается как "AB"?
Почему это в Perl:Perl substr (STRING, @ARRAY) ne substr (STRING, OFFSET, LENGTH)?
@x=(0,2);
substr('abcd',@x)
оценивается как "CD"?
И это:
substr('abcd',0,2);
оценивается как "AB"?
Первый использует @x
в скалярном контексте ... что означает размер @x
, так substr('abcd',2)
дает cd
.
зиЬзЬг имеет прототип в качестве встроенной функции, поэтому @x не расширена оценивается в скалярном контексте, который возвращает 2, так что в основном вы звоните SUBSTR («ABCD», скалярная (@x))
документально синтаксис оператора 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
«s первый аргумент вычисляется в скалярном контексте.substr
2-й аргумент оценивается в скалярном контексте.substr
3-й аргумент (необязательно) оценивается в скалярном контексте.substr
4-й аргумент (необязательно) оценивается в скалярном контексте.@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 Я узнал что-то новое;) – Sorin
Спасибо за осветительные быстрые ответы – user1087245