Llamada a Funciones definidas por el Usuario - AWK

La llamada a una función hace que se ejecute la función y realice su trabajo. Una llamada a función es una expresión, y su valor es el valor devuelto por la función.

Una llamada a función consiste en el nombre de la función seguido por los argumentos entre paréntesis. Lo que escribes en la llamada para los argumentos son expresiones awk; cada vez que se ejecute la llamada, estas expresiones son evaluadas, y sus valores son los argumentos actuales. Por ejemplo, aquí aparece una llamada a foo con tres argumentos:

foo(x y, "lose", 4 * z)

Nota: los espacios en blanco (espacios y tabuladores) no están permitidos entre el nombre de la función y el paréntesis de apertura de la lista de argumentos. Si escribes un espacio en blanco por error, awk podría pensar que deseas concatenar una variable con la expresión entre paréntesis. Sin embargo, te avisa de que usaste un nombre de función en lugar de un nombre de variable, y devuelve un error.

Cuando una función es llamada, se le proporciona una copia de los valores de sus argumentos. A esto se le llama llamada por valor. El llamador podría usar una variable como la expresión para el argumento, pero la función llamada no sabe esto: todo lo que sabe es el valor que tiene el argumento. Por ejemplo, si escribes este código:

foo = "bar"
z = myfunc(foo)

entonces no deberías pensar en el argumento de myfunc como si fuese “la variable foo”. En su lugar, piensa en el argumento como la cadena, “bar”.

Si la función myfunc altera los valores de sus variables locales, esto no tiene efecto en cualquier otra variable.

En particular, si myfunc hace esto:

function myfunc (win) { print win
win = "zzz" print win
}

para cambiar su primer variable argumento win, esto no cambia el valor de foo de la llamada. La función de foo en la llamada a myfunc acabó cuando su valor, “bar”, se procesó. Si win existe también fuera de myfunc, el cuerpo de la función no puede alterar este valor externo, porque está escondido durante la ejecución de myfunc y no puede ser visto o alterado desde allí.

Sin embargo, cuando los parámetros de las funciones son arrays, ellos no pueden ser copiados. En su lugar, el mismo array está disponible para la manipulación directa por parte de la función. A esto se le llama normalmente llamada por referencia. Los cambios realizados a un parámetro array dentro del cuerpo de la función son visibles fuera de dicha función. Esto podría ser peligroso si no te fijas en lo que estás haciendo. Por ejemplo:

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]
}

imprime `a[1] = 1, a[2] = two, a[3] = 3', porque la llamada a changeit almacena “two” en el segundo elemento de a.


































Publicar un comentario

0 Comentarios