2013-08-12 2 views
4

Я не понимаю, как это вернет 4 в качестве ответа. Не уверен, что происходит внутри подпрограммы.perl 101 подпрограмма и возвращаемое значение



sub bar {@a = qw (10 7 6 8);} 
my $a = bar(); 
print $a; 

# outputs 4 

+3

Я рекомендую прочитать раздел "Контекст" в [Learn Perl примерно 2 часа 30 минут] (http://qntm.org/files/perl/perl.html). – ThisSuitIsBlackNot

+0

Что вы ожидаете от него? – toolic

+0

Контекст! Я помню, что в изучении Perl, что в связи с этим вопросом контекста была строка, в которой говорилось что-то вроде «это самый важный урок, который вы узнаете в этой книге, на самом деле, это самый важный урок, который вы узнаете в своей карьере Perl ». После 4 месяцев болезненного Perl OTJ я могу заверить, что мужчина был мудр. – ado

ответ

12

Подпрограмма вызывается в скалярном контексте. Последним оператором в подпрограмме является присвоение @a, которое является выражением и поэтому становится подразумеваемым возвращаемым значением. В скалярном контексте это оценивается числом элементов, возвращаемых правой стороной присваивания (что бывает таким же, как число элементов в @a).

+0

Но нет возврата. – airnet

+9

return подразумевается в perl –

+0

@airnet - я немного изменил свой ответ. –

3

В Perl возвращаемое значение подпрограммы является последним выраженным, если нет заданного оператора return.

perlsub Из документации:

Если нет возврата не будет найден, и если последнее утверждение является выражение, его значение возвращается. Если последний оператор представляет собой структуру управления циклом как foreach или некоторое время, возвращаемое значение не указывается. Пустое подпункт возвращает пустой список.

+1

@ikegami - Вы, кажется, неправильно читаете (я полагаю, преднамеренно) и этот ответ, и мой. Несмотря на ваши жалобы на наши ответы, никто из нас не сказал, что «последнее выражение оценивается как« @ a ». Мне кажется очевидным, что мы оба говорим, что последнее выражение - это присваивание '@ a'_, что именно вы говорите. Вы говорите, что считаете 'sub bar {() = qw (10 7 6 8)}'. Какой вывод мы должны извлечь из рассмотрения? Что он ведет себя так, как мы уже описали? Удивительно. –

+0

@Ted Hopp, Вы утверждали, что назначение списка в скалярном контексте возвращает результат LHS в скалярном контексте. Этот пример показывает, что вы ошибаетесь. Остальные ваши точки адресуются под вашим узлом, где вы также их воспитывали. Вы должны прочитать мой пост, если хотите узнать, что на самом деле происходит. [Обратите внимание, что squiguy удалил неправильную часть (оставив частичный ответ позади). Таким образом, я удалил свой предыдущий комментарий.] – ikegami

+1

@ikegami - Я сделал ** не ** утверждать, что назначение списка в скалярном контексте возвращает результат LHS в скалярном контексте. Ваш пример действительно показывает, что я ошибался. Поздравляем, вы сбили своего [соломенного человека] (http://www.nizkor.org/features/fallacies/straw-man.html). –

5

Каждый из возвратных выражений подпрограммы, в (то есть операнд return заявлений и каких-либо окончательных выражений суб) оцениваются в том же контексте, что и вызов подпрограммы себя.

sub f { 
    ... 
    return THIS if ...; 
    return THIS if ...; 
    ... 
    if (...) { 
     ... 
     THIS 
    } else { 
     ... 
     THIS 
    } 
} 

В этом случае выражение return представляет собой назначение списка. (@a и qw являются операндами задания и, таким образом, оцениваются перед назначением.) Назначение списка в скалярном контексте оценивается числом элементов, на которые была оценена его правая сторона.

Mini-Tutorial: Scalar vs List Assignment Operator См

Смежные вопросы