# Laboratório de expressões de iRules

> Avalie uma expressão do jeito que expr e if fazem num iRule e veja cada passo: como cada operando foi lido, comparação numérica ou de texto, precedência, onde o && parou, e == ao lado de eq. Modo Tcl 8.4 ou iRules. Local, sem rede.

- Tool: https://ronutz.com/pt-BR/tools/f5-irules-expression-lab
- Family: Redes

---

## O que faz

Avalia uma expressão do jeito que `expr`, `if` e `while` fazem num iRule e mostra a avaliação inteira: o valor e como ele é guardado, a expressão com os operandos de cada operador entre parênteses para deixar a precedência visível, uma árvore com cada passo e, numa comparação, o que `==`, `eq`, `<` e `>` fazem com os mesmos dois operandos. As variáveis recebem valores por comandos `set` comuns, então as aspas se comportam exatamente como num iRule.

Dois modos: **Tcl 8.4** (Tcl 8.4.6 puro, a base que a F5 indica no K6091) e **iRules**, que acrescenta os operadores documentados pela F5 (`contains`, `starts_with`, `ends_with`, `equals`, `matches_glob`, `matches_regex`, `and`, `or`, `not`) e comandos de requisição como `[HTTP::uri]`, respondidos a partir de uma requisição de exemplo editável.

## Como ler a árvore

Cada caixa é uma parte da expressão: o trecho, uma seta e o que ele produziu. Os operandos ficam abaixo do seu operador. As notas sob uma caixa dizem o que aconteceu ali, por exemplo "Comparado como inteiros: 10 e 10" para `$x == $y` com `x` valendo `012`, ou "Comparado como texto porque o lado esquerdo não é um número". Uma parte marcada como "nunca avaliado" foi pulada por `&&`, `||` ou `?:`.

## Vale saber

- `==` e os outros operadores de comparação comparam números quando os dois lados são lidos como números, e texto caso contrário. `eq` e `ne` sempre comparam texto.
- Numa comparação de texto, os códigos dos caracteres decidem, então toda letra maiúscula vem antes de toda minúscula: `"bench" < "Chair"` é falso.
- `true == 1` é falso: `true` é uma palavra booleana, não um número, então a comparação é entre textos.
- O Tcl 8.4 não tem o operador `**`; `2 ** 3` é erro de sintaxe.
- A divisão inteira arredonda em direção ao infinito negativo (`7 / -2` dá `-4`) e o resto fica com o sinal do divisor.
- Um literal como `08` escrito na expressão é recusado quando a expressão é compilada, antes que qualquer parte dela rode.
- Coloque as expressões entre chaves. Sem chaves, o Tcl substitui o texto duas vezes, o que é mais lento e deixa dados rodarem como código (F5 K57410758 e K15650046). O executor passo a passo mostra isso acontecendo.

## Limites

A F5 documenta seus operadores em palavra, mas não a precedência deles em relação aos operadores do Tcl; a ferramenta coloca `contains`, `starts_with` e os demais junto com `==`, e `and` e `or` junto com `&&` e `||`. `rand()` e `srand()` são recusados porque seus resultados não podem ser reproduzidos. Comandos que rodam dentro de uma expressão (entre colchetes) usam o mesmo pequeno interpretador do executor passo a passo, limitado a 2.000 comandos. Esta ferramenta não é oferecida pela API, porque executa o Tcl que você fornece.

## Fontes

- [F5 K6091: The version of Tcl used to develop iRules](https://my.f5.com/manage/s/article/K6091) (lido em 2026-10-03)
- [Manual do Tcl 8.4: expr](https://www.tcl-lang.org/man/tcl8.4/TclCmd/expr.htm) (lido em 2026-10-03)
- [Referência de iRules da F5: Operators](https://clouddocs.f5.com/api/irules/Operators.html) (lido em 2026-10-02)
- [F5 K57410758: use curly braces to avoid double substitution](https://my.f5.com/manage/s/article/K57410758) (lido em 2026-10-03)
- [F5 K15650046: Tcl code injection security exposure](https://my.f5.com/manage/s/article/K15650046) (lido em 2026-10-03)

## Standards and references

- [F5 K6091: The version of Tcl used to develop iRules](https://my.f5.com/manage/s/article/K6091) - the iRules command set was developed from Tcl base version 8.4.6, which is used in all BIG-IP versions; the engine models that version
- [Tcl 8.4 manual: expr](https://www.tcl-lang.org/man/tcl8.4/TclCmd/expr.htm) - operand notation (decimal, octal with a leading 0, hexadecimal with 0x), operator precedence, string comparison, eq and ne, and the sign of a remainder
- [F5 iRules reference: Operators](https://clouddocs.f5.com/api/irules/Operators.html) - the Tcl operators by precedence and the operators F5 adds: contains, ends_with, equals, matches_glob, matches_regex, starts_with, and, not, or
- [F5 K57410758: warning [use curly braces to avoid double substitution]](https://my.f5.com/manage/s/article/K57410758) - expr, if and while substitute an unbraced argument a second time; the validator warning and the braced fix
- [F5 K15650046: Tcl code injection security exposure](https://my.f5.com/manage/s/article/K15650046) - always brace expressions; always put -- before the switch string; the bad option error a value starting with - produces
- [F5 iRules reference: HTTP::uri](https://clouddocs.f5.com/api/irules/HTTP__uri.html) - HTTP::uri returns the URI part of the request (path and query); the sample request answers it
- [F5 iRules reference: HTTP::host](https://clouddocs.f5.com/api/irules/HTTP__host.html) - HTTP::host returns the Host header value (with the port when it is not the standard one); the sample request answers it
- [Tcl 8.4.6 source code, tag core-8-4-6 on GitHub](https://github.com/tcltk/tcl/tree/core-8-4-6) - the reference interpreter: the engine was differential-tested against tclsh built from this tag (commit bf3eeadc)

## Related reading

- [Comparações em iRules: == versus eq, precedência e a volta silenciosa para texto](https://ronutz.com/pt-BR/learn/irules-expression-operators.md): Num iRule, == compara números quando pode e texto quando não pode, enquanto eq sempre compara texto. Essa regra explica por que 012 == 10 é verdadeiro, por que true == 1 é falso e por que bench vem depois de Chair. Veja as regras de comparação do Tcl 8.4.6, a precedência que agrupa uma expressão e os operadores da própria F5.
- [iRules LX, explicado: o que roda onde quando o Tcl chama o Node.js](https://ronutz.com/pt-BR/learn/irules-lx-explained.md): O iRules LX coloca um processo Node.js ao lado do Traffic Management Microkernel e deixa uma iRule em Tcl chamá-lo com ILX::call, esperar no máximo três segundos por padrão e receber a resposta como um valor Tcl. Este é o mecanismo inteiro, objeto por objeto e comando por comando, a partir da referência da própria F5: workspaces, extensões, plugins e a LX rule; ILX::init, ILX::call e ILX::notify; os modos de processo dedicado e único; o npm sem conexão com a internet; o runtime Node.js 6.9.1 que o BIG-IP 21.1 ainda entrega depois de remover o 0.12; a atualização que costumava quebrar workspaces; e as perguntas a fazer antes de um projeto depender dele.
- [Números em iRules: octal, hexadecimal, e por que 08 não é um número](https://ronutz.com/pt-BR/learn/irules-tcl-number-notation.md): Os iRules leem números pelas regras do Tcl 8.4.6, e essas regras escondem uma armadilha: um zero à esquerda significa octal, então 010 é oito e 08 nem é um número. Veja como o Tcl lê inteiros e doubles, os dois lugares onde ele os lê, e os valores com zero à esquerda que quebram regras de verdade.
- [O iRules Style Guide do DevCentral, regra por regra, com os motivos](https://ronutz.com/pt-BR/learn/irules-style-guide-explained.md): O DevCentral da F5 publicou em 2022 um iRules Style Guide: configurações de editor e vinte regras numeradas. Algumas são questão de gosto, mas várias evitam falhas reais: um iRule que não carrega, um switch que um atacante consegue manipular, uma expressão que roda dados da requisição como código, uma tempestade de log. Veja as regras agrupadas pelo que protegem, com o motivo de cada uma, o que os comentários do guia corrigiram e o que mudou desde que ele foi escrito.
- [Zero ou um: onde o BIG-IP começa a contar](https://ronutz.com/pt-BR/learn/bigip-zero-or-one.md): O Tcl conta a partir de 0, vários comandos que a F5 acrescenta contam a partir de 1, contadores devolvem 1 para o primeiro item, muitos zeros da configuração são valores e não posições, e o mesmo segmento de caminho é o elemento 1, o campo 2 ou o índice 1 dependendo de quem pergunta. Veja de onde vem cada um, nas palavras da própria F5, com as armadilhas e os lugares em que as páginas da F5 se contradizem.
