No AWK, para ordenar um array, posso definir minha própria função de ordenação, tanto para controlar a travessia de um array em um loop for, quanto para chamar asort
or asorti
. A assinatura da função de comparação aceita até 6 parâmetros, embora os dois últimos sejam opcionais:
function cmp_field(i1, v1, i2, v2, l, r) { whatever; }
Qual é o propósito de l
e r
? Pelo que entendi, eles são apenas marcadores de posição que não são usados ou inspecionados pelo AWK, mas sim uma conveniência para mim, para que eu possa armazenar valores dentro deles, como algum tipo de variáveis auxiliares de conveniência. Como atribuir em l
e r
valores temporários calculados de v1
e v2
. No entanto, por que preciso deles ou qual é o propósito deles, se eu posso simplesmente declarar minhas próprias variáveis como:
function cmp_field(i1, v1, i2, v2) {
l = computation(v1);
r = computation(v2);
whatever;
}
Existe alguma outra diferença além de l
e r
sendo variáveis globais no segundo exemplo? Ou existe alguma outra razão além disso?
Parâmetros de função são locais. Outras variáveis são globais.
Da especificação :
e:
Todas as variáveis em awk são GLOBAIS, a menos que sejam usadas em uma assinatura de função. Portanto, se você usar
l
andr
dentro decmp_field
it, o valor del
and será alterador
globalmente, a menos que seja parte da assinatura da função.Se você adicionar as variáveis que você usa dentro da sua função, mesmo que não sejam usadas ao chamar sua função, elas se tornam locais para essa função. A convenção é fazer algo como:
Considere este exemplo:
Impressões: