# Bancada de strings de iRules

> Rode um comando string do Tcl 8.4 (range, first, map, match, compare, trim e outros) e veja o resultado numa régua de caracteres: o que foi buscado, casado, devolvido ou trocado, e como índices como end-1 ou 010 foram lidos. Local, sem rede.

- Tool: https://ronutz.com/pt-BR/tools/f5-irules-string-workbench
- Family: Redes

---

## O que faz

Roda um subcomando `string` do Tcl 8.4.6 e desenha o resultado numa régua de caracteres: cada caractere da string com seu índice, colorido conforme o que o comando fez com ele (buscado, casado, devolvido, trocado, removido, ou a primeira diferença numa comparação). São dezessete subcomandos: `length`, `bytelength`, `tolower`, `toupper`, `range`, `index`, `first`, `last`, `map`, `match`, `compare`, `equal`, `trim`, `trimleft`, `trimright`, `replace` e `repeat`.

## Como ler o resultado

- **O comando** é a linha exata para colar num iRule, com as aspas de que o Tcl precisa.
- **A régua** numera os caracteres a partir de 0, do mesmo jeito que todo argumento de índice conta.
- **Argumentos de índice** mostra como cada índice foi lido: `end-1` é o penúltimo caractere, e um índice escrito `010` é octal, então significa 8.
- **A passada única do string map** lista cada posição: mantida, ou trocada por qual chave e valor.

## Vale saber

- `length` conta caracteres; `bytelength` conta os bytes do UTF-8 interno do Tcl, então `héllo` tem 5 caracteres e 6 bytes.
- `string map` faz uma passada da esquerda para a direita. Em cada posição vence a primeira chave da lista que casar, e o texto trocado nunca é examinado de novo: `string map {a 1 ab 2} abab` dá `1b1b`, enquanto `{ab 2 a 1}` dá `22`.
- `compare` ordena pelo código do caractere, então `string compare bench Chair` dá 1.
- `string index` e `string range` devolvem uma string vazia, não um erro, quando o índice está fora da string.
- `trim` remove um **conjunto** de caracteres, em qualquer ordem, não uma palavra.
- O Tcl 8.4.6 aceita `e` ou `en` sozinhos como `end`, mas `e-1` dá erro.
- A conversão de caixa usa as tabelas Unicode do próprio Tcl 8.4.6, que diferem das de um navegador moderno em cerca de mil caracteres (por exemplo, o Tcl 8.4.6 não tem forma maiúscula para `µ`).

## Limites

Caracteres fora do Plano Multilíngue Básico são recusados, porque o Tcl 8.4 não consegue guardá-los como um único caractere. `string is`, `totitle`, `wordstart` e `wordend` não são modelados. O resultado de `repeat` é limitado a 100.000 caracteres.

## Fontes

- [Manual do Tcl 8.4: string](https://www.tcl-lang.org/man/tcl8.4/TclCmd/string.htm) (lido em 2026-10-03)
- [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 contra o qual o motor é testado)

## 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: string](https://www.tcl-lang.org/man/tcl8.4/TclCmd/string.htm) - the subcommands, index forms (integer, end, end-N), map ordering and its single pass, compare and bytelength
- [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

- [Comandos string do Tcl em iRules: índices, map, match, compare e trim](https://ronutz.com/pt-BR/learn/irules-string-commands.md): O comando string faz a maior parte do trabalho com texto num iRule, e cada subcomando tem uma regra que costuma ser errada: índices que leem 010 como octal, um map que é uma passada só, um trim que remove um conjunto de caracteres e não uma palavra, e um compare que põe toda maiúscula antes de toda minúscula.
- [findstr, substr e getfield: o que a F5 documenta e o que deixa em aberto](https://ronutz.com/pt-BR/learn/irules-findstr-substr-getfield.md): A F5 acrescenta três comandos aos iRules para recortar um pedaço de um valor. findstr encontra e pula, substr começa num índice, getfield divide num separador, e dois deles recebem um terminador que é um comprimento ou um texto de parada. Veja cada regra com os próprios exemplos da F5, o Tcl puro que faz o mesmo trabalho e os casos que as páginas da F5 não resolvem.
- [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.
