2012-01-26 2 views

ответ

4

Первый использует @x в скалярном контексте ... что означает размер @x, так substr('abcd',2) дает cd.

5

зиЬзЬг имеет прототип в качестве встроенной функции, поэтому @x не расширена оценивается в скалярном контексте, который возвращает 2, так что в основном вы звоните SUBSTR («ABCD», скалярная (@x))

12

документально синтаксис оператора 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) 
+0

+1 Я узнал что-то новое;) – Sorin

+0

Спасибо за осветительные быстрые ответы – user1087245