Руководство пользователя для GNU Awk
13.3 Вызов функций, определенных пользователем
Вызов функции подразумевает запуск ее тела для выполнения необходимых действий. Вызов функции есть выражение, и его значение есть значение, возвращаемое функцией.
Вызов функции состоит из имени функции с последующими аргументами в скобках. То, что вы пишите в вызове в качестве аргументов, также есть выражения awk; каждый раз, когда выполняется вызов, эти выражения вычисляются и их значения становятся фактическими аргументами. Например, вот вызов foo с тремя аргументами (первый есть конкатенация цепочек):
foo(x y, "lose", 4 * z)
ВНИМАНИЕ: символы whitespace (пробелы и табуляции) не допускаются между именем функции и открывающей скобкой списка аргументов. Если вы по ошибке напишете здесь whitespace, то awk может подумать, что вы хотите соединить переменную с выражением в скобках. Вместе с тем awk замечает, что используется имя функции, а не переменной, и выдает сообщение об ошибке.
Когда вызывается функция, она получает копии значений ее аргументов. Это называется вызов по значению. Вызывающая сторона может использовать переменную как выражение для аргумента, но вызываемая функция этого не знает: она знает только значение аргумента. Например, если вы напишите такой код:
foo = "bar" z = myfunc(foo)
вы не должны думать об аргументе для myfunc как о "переменной foo." Вместо этого вы должны думать об аргументе как о строковом значении "bar". Если функция myfunc изменяет значения своих локальных переменных, это не влияет ни на какие другие переменные. Так, если myfunc делает так:
function myfunc(str) -
print str str = "zzz" print str ""
для изменения своего первого аргумента --- переменной str, это не изменит значения foo в месте вызова. Роль foo при вызове myfunc кончается, когда вычисляется ее значение "bar". Если str также существует вне myfunc, тело функции не может изменить это внешнее значение, потому что оно затенено во время выполнения тела myfunc и не может быть увидено или изменено оттуда.
Вместе с тем, когда массивы служат параметрами функций, они не копируются. Наоборот, они доступны для прямых манипуляций из тела функции. Это обычно называется вызов по имени (или по ссылке). Изменения, сделанные в параметре массиве внутри тела функции, видимы вне этой функции. Это может быть очень опасно, если не следить за тем, что вы делаете.
Например:
function changeit(array, ind, nvalue) -
array[ind] = nvalue ""
BEGIN -
a[1] = 1; a[2] = 2; a[3] = 3 changeit(a, 2, "two")
printf "a[1] = %s, a[2] = %s, a[3] = %s"n",
a[1], a[2], a[3] ""
Эта программа печатает `a[1] = 1, a[2] = two, a[3] = 3', потому что changeit присваивает "two" второму элементу массива a.
Некоторые реализации awk позволяют вызывать функции, которые не были определены, и только сообщают об этом во время исполнения, когда программа фактически пытается вызвать функцию.
Например:
BEGIN -
if (0)
foo() else
bar() "" function bar() - ... "" # заметим, что `foo' не определена
Так как оператор `if' никогда не будет `true', неопределенность foo не создает проблем. Хотя обычно это проблема, если программа вызывает неопределенную функцию.
Если было указано `--lint' (см. раздел 14.1 [Параметры командной строки], стр. 161), gawk сообщит о вызове неопределенных функций.
Некоторые реализации awk генерируют динамические ошибки, если вы используете оператор next (см, раздел 9.7 [Оператор next], стр. 111) внутри функции пользователя. gawk не имеет этой проблемы.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|