awk: prática recomendada para nomeação de variáveis de loop [closed]

0

O código a seguir resulta em um loop infinito porque awk não suporta variáveis locais em { … } scope .

#! /usr/bin/gawk -f

function myfunction() {
    for (i = 5; i < 8; i++){
        print "in myfunction(), i="i
    }
}

BEGIN {
    for (i = 0; i < 10; i++) {
        myfunction();
        print i;
    }
}

Existem duas maneiras de lidar com esse problema:

  1. Declare a variável de loop i como argumentos , por exemplo myfunction( i) .

Observe que o espaço extra antes de i é uma convenção de codificação para indicar que i é uma variável local, não um argumento .

  1. Use a convenção de nomenclatura para evitar 'colisão' , por exemplo, _module_begin_loop , _module_myfunction_loop .

Descobri que a primeira solução é bastante complicada para uma variável de loop, pois myfunction() não é necessariamente chamado em um loop. Quanto ao segundo, pode fazer um nome longo que diminuirá a legibilidade.

    
por Firmin Martin 12.05.2018 / 23:47

1 resposta

1

Encontrei uma resposta quando estava preparando esta pergunta. Outras respostas são bem vindas.

Em um projeto awk relativamente grande, como translate-shell , a primeira solução é usada:

function parseList(returnAST, tokens,
                   leftBrackets,
                   rightBrackets,
                   separators,
                   ####
                   i, j, key, p, stack, token) {
   ...
}

parâmetros após #### são locais.

o awk permite chamar a função com menos parâmetros, por ex. parseList(ast, tokens) ou parseList(ast, tokens, lb, rb, sep) . Portanto, apenas a assinatura é complicada.

    
por 12.05.2018 / 23:48