Dada uma string que representa uma matriz de números, devolve as linhas e as colunas dessa matriz.
Assim, dada uma string com quebras de linha incorporadas como esta:
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
o teu código deve conseguir produzir:
As linhas da nossa matriz de exemplo:
E as suas colunas:
Este é o primeiro exercício em que a solução não é um script "main". O objetivo é escrever uma biblioteca de funções para serem incluídas noutros programas awk. Há vários conceitos novos e interessantes para explorar neste exercício.
As secções seguintes assinaladas com "(gawk)" são extensões específicas do GNU awk.
Neste exercício, vais ler dados de um ficheiro, e não do fluxo de entrada principal.
Lê sobre getline no manual do Gnu awk, em particular as formas Getline/File e Getline/Variable/File.
Um array bidimensional pode ser uma forma de implementar esta solução. O GNU awk tem duas formas de representar um:
Repara na diretiva @include no ficheiro de teste.
Isto diz ao gawk para ler e avaliar o ficheiro indicado.
Todas as variáveis do awk são globais (exceto os parâmetros de função, que são locais à função).
Há um elevado potencial de colisões de nomes, sobretudo quando se incluem bibliotecas de terceiros.
Os espaços de nomes são uma forma de dividir o local onde as variáveis são guardadas.
Repara na diretiva @namespace nos ficheiros do exercício.
O espaço de nomes predefinido chama-se "awk". Ter um espaço de nomes predefinido permite ao programador chamar uma função incorporada do awk a partir de dentro de uma função que está noutro espaço de nomes.
Os parâmetros do tipo array são passados por referência. As alterações feitas ao array dentro da função são visíveis em quem a chamou.
Os parâmetros que não são arrays são passados por valor.
No caso dos parâmetros sem tipo, tudo depende do que a função faz com eles:
Encontras todos os detalhes no manual, em Passar argumentos de função por valor ou por referência.
É possível criar variáveis com âmbito de função (locais) recorrendo a parâmetros "passados por valor". Não é um erro passar menos valores a uma função do que o número de parâmetros listados; os parâmetros a mais ficam "sem tipo" até serem utilizados. Eles estão disponíveis para lhes serem atribuídos valores escalares dentro da função, que não são guardados no espaço de nomes global.
Por convenção, na assinatura da função aparecem primeiro os parâmetros esperados, seguidos de algum espaço em branco e, depois, os parâmetros locais. Um exemplo:
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
}
Inscreve-te no Exercism para aprenderes e dominares AWK com 3 conceitos92 exercícios, e mentoria humana real, tudo grátis.