Lasagna

Lasagna

Exercício de aprendizagem

Introdução

Variáveis

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 | ...

A saída do filtro é a entrada

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]

Escopo da variável

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.

Nomes de variáveis

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.

Atribuição com desestruturação

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]]
Note

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}

Constantes

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, variáveis não são necessárias

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:

  • o array de entrada [2,4,8,7] é passado para add (que soma os números aplicando o operador + a todos os elementos)
  • em paralelo, [2,4,8,7] também é passado para length
  • quando essas subexpressões terminam, seus resultados são então divididos, retornando o valor médio dos números no array de entrada.

Operadores do jq que você vai precisar para o exercício de aprendizagem

Operador alternativo: //

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 | ...
Operadores aritméticos
  • +, - e * são os operadores usuais de adição, subtração e multiplicação numérica.

Instruções

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.

1. Defina o tempo esperado no forno em minutos

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,
  ...

2. Calcule o tempo restante no forno em minutos

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,
  ...

3. Calcule o tempo de preparo em minutos

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,
  ...

4. Calcule o tempo total de trabalho em minutos

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,
  ...
Editar via GitHub O link abre em uma nova janela ou aba
jq Exercism

Tudo pronto para começar Lasagna?

Crie sua conta no Exercism para aprender e dominar jq com 12 conceitos75 exercícios e mentoria humana de verdade, tudo de graça.