Lembre-se de que um programa jq é um pipeline de expressões.
A atribuição de variável segue esta regra: uma atribuição de variável é uma expressão que se parece com:
... | expr as $varname | ...
Assim como a expressão de identidade ., a saída da atribuição de variável é igual à sua entrada.
Definir o valor da variável é um efeito colateral.
O exemplo a seguir mostra que o . depois da atribuição é igual à entrada inicial:
$ jq -c -n '42 | (. * 2) as $double | [., $double]'
[42,84]
O escopo da variável é "lexical": a variável fica no escopo pelo resto do pipeline. Variáveis definidas em funções (vamos tratar de funções mais adiante) são "locais" à função.
A variável precisa começar com $.
O resto do nome da variável é um identificador: começa com uma letra ou um sublinhado, seguido de letras, números ou sublinhados.
Do manual:
É possível declarar várias variáveis usando uma única expressão
as, fornecendo um padrão que corresponde à estrutura da entrada (isso é conhecido como "desestruturação").
Exemplos:
[1, 2, 3] as [$a, $b, $c]
| [$a, $b, $c] # => [1, 2, 3]
{"foo": "bar", "len": [10, 20]} as {foo: $f, len: [$h, $w]}
| [$f, $h, $w] # => ["bar", 10, 20]
Fazer o nome da variável coincidir com a chave do objeto oferece um atalho:
{"x": 4, "y": 7} as {$x, $y}
| [$x, $y] # => [4, 7]
{"foo": "bar", "len": [10, 20]} as {$foo, $len}
| [$foo, $len] # => ["bar", [10, 20]]
O mesmo atalho funciona no sentido inverso para a construção de objetos
4 as $x | 7 as $y | {$x, $y} # => {"x":4, "y": 7}
Como mostra o exemplo acima, variáveis são úteis para armazenar constantes. É melhor dar um nome às constantes do que deixar "números mágicos" aparecerem no código.
Muitas vezes, é mais legível omitir variáveis.
Considere calcular a média de uma lista de números
[2, 4, 8, 7]
| add as $sum
| length as $len
| $sum / $len
em comparação com
[2, 4, 8, 7] | add / length
Isso destaca um dos aspectos mais poderosos do jq: a entrada de um filtro é fornecida a cada subexpressão:
[2,4,8,7] é passado para add (que soma os números aplicando o operador + a todos os elementos)[2,4,8,7] também é passado para length
jq que você vai precisar para o exercício de aprendizagem//
A expressão a // b produz b se a for false ou null; caso contrário, produz a.
No contexto de definir uma variável, isso é muito útil para fornecer um valor padrão:
(.input.theAnswer // 42) as $answer | ...
+, - e * são os operadores usuais de adição, subtração e multiplicação numérica.Neste exercício, você vai escrever um pouco de código para ajudar a preparar uma lasanha incrível usando seu livro de receitas favorito.
Você tem quatro tarefas, todas relacionadas ao tempo gasto no preparo da lasanha.
Defina uma constante chamada $expected_minutes_in_oven.
De acordo com o livro de receitas, o tempo esperado no forno em minutos é 40:
$ jq -n -f lasagna.jq
{
"expected_minutes_in_oven": 40,
...
Esse valor recebe como entrada os minutos reais que a lasanha já ficou no forno e retorna quantos minutos ela ainda precisa ficar lá, com base no tempo esperado no forno em minutos da tarefa anterior.
$ echo '{"actual_minutes_in_oven": 18}' | jq -f lasagna.jq
{
"expected_minutes_in_oven": 40,
"remaining_minutes_in_oven": 22,
...
O tempo de preparo é quanto tempo leva para deixar a lasanha pronta antes de colocá-la no forno. Leva 2 minutos para preparar cada camada.
$ echo '{"number_of_layers": 3}' | jq -f lasagna.jq
{
...
"preparation_time": 6,
...
Calcule quantos minutos no total você trabalhou no preparo da lasanha. É a soma do tempo de preparo em minutos com o tempo em minutos que a lasanha passou no forno no momento.
$ echo '{"actual_minutes_in_oven": 10, "number_of_layers": 2}' | jq -f lasagna.jq
{
...
"total_time": 14,
...
Crie sua conta no Exercism para aprender e dominar jq com 12 conceitos75 exercícios e mentoria humana de verdade, tudo de graça.