Возвращаемые значения

Вызов функции всегда является частью выражения, даже если результат вызова не используется напрямую. Вызвав &marine в предыдущем примере, мы вычисляли значение выражения, содержащего вызов, но игнорировали его результат. Чаще при вызове функции ее непосредственный результат – иначе говоря, возвращаемое значение – используется в программе. Все пользовательские функции Perl имеют возвращаемое значение; не существует различий между функциями, которые возвращают значение, и теми, которые этого не делают. Впрочем, не все пользовательские функции Perl имеют полезное возвращаемое значение.

Так как любая пользовательская функция Perl может быть вызвана с применением возвращаемого значения, было бы немного расточительно определять специальный синтаксис для «возвращения» конкретного значения. Ларри поступил просто: в ходе выполнения пользовательской функции Perl совершает серию действий с вычислением различных значений. То значение, которое было вычислено последним, автоматически становится возвращаемым значением. Допустим, в программе определяется следующая пользовательская функция:

sub sum_of_fred_and_barney {
print "Hey, you called the sum_of_fred_and_barney subroutine!\n";
$fred + $barney; # Возвращаемое значение
}

Последним выражением, вычисляемым в теле функции, является сумма $fred и $barney; соответственно сумма $fred и $barney становится возвращаемым значением функции.


Вот как это выглядит в действии:

$fred = 3;
$barney = 4;
$wilma = &sum_of_fred_and_barney; # $wilma присваивается 7
print "\$wilma is $wilma.\n";
$betty = 3 * &sum_of_fred_and_barney; # $betty присваивается 21
print "\$betty is $betty.\n";

Результат выполнения программы выглядит так:
Hey, you called the sum_of_fred_and_barney subroutine!
$wilma is 7.
Hey, you called the sum_of_fred_and_barney subroutine!
$betty is 21.

Команда print используется только для отладки, чтобы вы убедились в успешном вызове функции. Когда программа будет готова, отладочную печать можно будет удалить. Но допустим, в конец тела функции была добавлена еще одна строка отладочной печати:

sub sum_of_fred_and_barney {
print "Hey, you called the sum_of_fred_and_barney subroutine!\n";
$fred + $barney; # А теперь это не возвращаемое значение!
print "Hey, I'm returning a value now!\n"; # Ой!
}

В этом примере последним вычисляемым выражением становится не команда сложения, а команда print. Обычно возвращаемое значение print равно 1 (признак успешного вывода), но нам нужно совсем другое возвращаемое значение.


Итак, будьте осторожны при включении дополнительного кода в функцию, потому что ее возвращаемое значение определяется значением последнего вычисленного выражения. Что же произошло во второй (ошибочной) функции с суммой $fred и $barney? Она не была присвоена никакой переменной, поэтому Perl проигнорировал ее. Если включить режим предупреждений, Perl заметит, что сложение двух переменных без присваивания не привело ни к какому полезному результату, и, вероятно, предупредит о «бесполезном сложении в пустом контексте». Термин «пустой контекст» всего лишь означает, что полученный ответ не сохраняется в переменной и не используется иным способом.

Под «последним вычисленным выражением» следует понимать именно вычисленное выражение, а не последнюю строку текста. Например, следующая функция возвращает большее из значений $fred и $barney:
sub larger_of_fred_or_barney {
if ($fred > $barney) {
$fred;
} else {
$barney;
}
}

Последним вычисляется либо выражение $fred, либо $barney; значение одной из этих переменных становится возвращаемым значением. Невозможно заранее сказать, будет ли возвращено значение $fred или $barney, пока функция не сравнит значения этих переменных во время выполнения.


Все рассмотренные примеры весьма тривиальны. Ситуация становится интереснее, когда при разных вызовах функции могут передаваться разные входные значения (вместо использования глобальных переменных). Собственно, мы уже вплотную подошли к этой теме.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Аргументы
Вызов пользовательской функции
Вызов функции без &
Директива use strict
Нескалярные возвращаемые значения

Вернуться в раздел: Perl / 3. Пользовательские функции