Руководство пользователя для GNU Awk
13. Функции, определенные пользователем
13.4 Оператор return
Тело функции пользователя может содержать оператор return. Этот оператор возвращает управление продолжению awk-программы. Его можно также использовать для возврата значения функции для использования в остальной части программы. Это выглядит так: return [expression]. Часть expression не обязательна. Если она опущена, возвращаемое значение не определено и, следовательно, непредсказуемо. Оператор return без expression подразумевается в конце каждого определения функции. Так что если управление достигает конца тела функции, то функция возвращает непредсказуемое значение. awk не предупреждает об использовании возвращенного значения такой функции.
Иногда нужно написать функцию для выполнения определенных действий, а не для получения возвращаемого значения. Такая функция соответствует пустой функции в Си или процедуре в Паскале. Так, может быть целесообразным не возвращать никакого значения; нужно просто держать в уме, что если вы используете значение такой функции, вы идете на риск. Вот пример пользовательской функции, которая возвращает значение наибольшего числа среди элементов массива:
function maxelt(vec, i, ret) -
for (i in vec) -
if (ret == "" ---- vec[i] ? ret)
ret = vec[i] "" return ret ""
Вы вызываете maxelt с одним аргументом, который есть имя массива. Локальные переменные i и ret не предназначены быть аргументами; если бы не было ничего, что препятствовало бы вам передать два или три аргумента функции maxelt, результаты могли бы быть странными. Дополнительный пробел перед i в списке параметров указывает, что i и ret не предполагаются быть аргументами. Это есть соглашение, которому вы должны следовать при определении функций.
Вот программа, которая использует нашу функцию maxelt. Она заполняет массив, вызывает maxelt и затем выдает максимальное число в этом массиве:
awk ' function maxelt(vec, i, ret) -
for (i in vec) -
if (ret == "" ---- vec[i] ? ret)
ret = vec[i] "" return ret ""
# Загрузка всех полей каждой записи в nums. -
for(i = 1; i != NF; i++)
nums[NR, i] = $i ""
END -
print maxelt(nums) ""'
Если задан следующий ввод:
1 5 23 8 16 44 3 5 2 8 26 256 291 1396 2962 100 -6 467 998 1101 99385 11 0 225
наша программа должна сообщить нам, что 99385 есть наибольшее число в массиве.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|