Dado un string que representa una matriz de números, devuelve las filas y las columnas de esa matriz.
Así, dado un string con saltos de línea incrustados como:
9 8 7
5 3 2
6 6 7
que representa esta matriz:
1 2 3
|---------
1 | 9 8 7
2 | 5 3 2
3 | 6 6 7
tu código debería ser capaz de producir:
Las filas de nuestra matriz de ejemplo:
Y sus columnas:
Este es el primer ejercicio en el que la solución no es un script «main». El objetivo es escribir una biblioteca de funciones para incluirla en otros programas awk. Hay varios conceptos nuevos e interesantes que ver en este ejercicio.
Las siguientes secciones, etiquetadas con «(gawk)», son extensiones específicas de GNU awk.
En este ejercicio, leerás datos de un fichero, no del flujo de entrada principal.
Lee sobre getline en el manual de GNU awk,
en particular, las formas Getline/File y Getline/Variable/File.
Un array bidimensional podría ser una forma de implementar esta solución. GNU awk tiene dos formas de representarlo:
Fíjate en la directiva @include del fichero de test.
Esto indica a gawk que lea y evalúe el fichero indicado.
Todas las variables de awk son globales (excepto los parámetros de función, que son locales a la función).
Existe una alta probabilidad de colisiones de nombres, sobre todo cuando se incluyen bibliotecas de terceros.
Los espacios de nombres son una forma de dividir dónde se almacenan las variables.
Fíjate en la directiva @namespace de los ficheros del ejercicio.
El espacio de nombres predeterminado se llama «awk». Tener un espacio de nombres predeterminado permite al programador llamar a una función integrada de awk desde dentro de una función en otro espacio de nombres.
Los parámetros de tipo array se pasan por referencia. Los cambios realizados en el array dentro de la función son visibles para quien la llama.
Los parámetros que no son arrays se pasan por valor.
Para los parámetros sin tipo, depende de lo que la función haga con ellos:
Todos los detalles están en el manual, en Pasar argumentos de función por valor o por referencia.
Las variables con scope de función (locales) se pueden crear usando parámetros «por valor». No es un error pasar a una función menos valores que el número de parámetros enumerados; los parámetros sobrantes están «sin tipo» hasta que se usan. Están disponibles para asignarles valores escalares dentro de la función que no se almacenan en el espacio de nombres global.
Por convención, en la firma de la función los parámetros esperados aparecen primero, seguidos de un espacio en blanco y, después, los parámetros locales. Un ejemplo:
function add(a, b, total) {
# here, `typeof(total)` is "untyped"
total = a + b
# now, `typeof(total)` is "number"
return total
}
BEGIN {
sum = add(5, 10)
print sum # 15
print typeof(total) # untyped, meaning "total" is unused in this scope
}
Regístrate en Exercism para aprender y dominar AWK con 3 conceptos92 ejercicios y mentoría humana real, todo gratis.