# Explicador de scan para iRules

> Informe um valor e um formato de scan e veja cada %d, %s ou %[^&] alinhado com os caracteres que consumiu, a variável que preencheu e exatamente por que a leitura parou. Explica o resultado -1 e as peculiaridades do Tcl 8.4. Local, sem rede.

- Tool: https://ronutz.com/pt-BR/tools/f5-irules-scan-explainer
- Family: Redes

---

## O que faz

`scan` é o jeito barato de desmontar um valor num iRule; a referência de `matches_regex` da F5 observa que um comando de string é mais eficiente que uma expressão regular e que a maioria dos casos pode ser resolvida com `string match` ou `scan`. Informe à ferramenta um valor, um formato e os nomes das variáveis, e ela alinha cada diretiva do formato com os caracteres que consumiu, o valor que produziu e a variável que o recebeu, e diz exatamente por que a leitura parou. O valor é desenhado numa régua, com os caracteres de cada conversão em uma cor.

## Como ler o resultado

- **scan devolveu** é o resultado do comando: com nomes de variáveis, a quantidade de variáveis que receberam valor; sem nomes, uma lista com os valores convertidos.
- **Diretiva por diretiva** tem uma linha por diretiva: um literal que precisava casar, um espaço em branco que pula qualquer quantidade, ou uma conversão como `%d`, `%s` ou `%[^&]`.
- **Variáveis depois** mostra o que cada variável nomeada contém. Uma variável depois do ponto onde a leitura parou não é definida por este scan.

## Vale saber

- `-1` significa que a entrada acabou antes da primeira conversão; `0` significa que uma conversão foi tentada e não casou. Verifique os dois casos quando um valor puder ser vazio.
- `%d` pula espaço em branco inicial e lê decimal; `%i` tira a base de um prefixo, então `08` lido com `%i` dá 0 e para no 8. Use `%d` para horários e códigos com zero à esquerda.
- `%s` para no espaço em branco; `%[^&]` lê tudo até um "e comercial" (`&`).
- O Tcl 8.4.6 guarda as conversões inteiras por meio de um `int` em C: `3000000000` lido com `%d` volta como `-1294967296`, e o modificador `l` não muda isso no 8.4.6. Para manter um número grande intacto, leia-o como texto com `%[0-9]` e deixe o `expr` interpretá-lo.
- `%n` guarda quanto da entrada foi consumido até ali. O manual fala em caracteres, mas o Tcl 8.4.6 conta bytes do seu UTF-8 interno, então cada caractere fora do ASCII conta 2 ou 3.

## Limites

O motor segue o `Tcl_ScanObjCmd` do Tcl 8.4.6 e foi conferido contra um interpretador Tcl 8.4.6 real em milhares de casos gerados. Resultados inteiros que dependem da biblioteca C da plataforma são marcados.

## Fontes

- [Manual do Tcl 8.4: scan](https://www.tcl-lang.org/man/tcl8.4/TclCmd/scan.htm) (lido em 2026-10-03)
- [Referência de iRules da F5: matches_regex](https://clouddocs.f5.com/api/irules/matches_regex.html) (lido em 2026-10-02)
- [F5 K6091: The version of Tcl used to develop iRules](https://my.f5.com/manage/s/article/K6091) (lido em 2026-10-03)
- [Código-fonte do Tcl 8.4.6, tag core-8-4-6](https://github.com/tcltk/tcl/tree/core-8-4-6) (o interpretador de referência)

## 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: scan](https://www.tcl-lang.org/man/tcl8.4/TclCmd/scan.htm) - the conversions, the -1 result, and %n (which the manual describes as characters; Tcl 8.4.6 counts bytes)
- [F5 iRules reference: matches_regex](https://clouddocs.f5.com/api/irules/matches_regex.html) - F5's note that a string command is more efficient than a regular expression, and that most cases can use string match or scan
- [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

- [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.
- [scan em iRules: como desmontar valores sem expressões regulares](https://ronutz.com/pt-BR/learn/irules-scan-command.md): A própria referência da F5 recomenda comandos de string como scan no lugar de expressões regulares. scan é curto e rápido, mas o resultado conta conversões e não casamentos, -1 e 0 significam coisas diferentes, e o Tcl 8.4.6 guarda inteiros por meio de um int em C de 32 bits. Veja como ler um formato e as verificações que tornam um scan confiável.
