O que queremos é uma função que retire espaços ao redor de uma string.
Neste caso devemos processar a string usando funções já prontas em Prisma da biblioteca string.
Usaremos a função string.corte para percorrer cada caractere e ao chegar em um caractere que não seja espaço marcar a posição com uma variável, do inicio para o final e depois do final para o inicio. Utilizaremos as variáveis ini (inicio) e final para marcar o início e fim da string excluindo os espaços ao redor se houver.
Depois basta cortar a string nestas posições marcadas pelas variáveis.
Veja o código:
//apare string (trim) string em prisma
str = ' ola mundo em Prisma! ';//string teste.
funcao apare(str)
str = str ou '';
se tipo(str) <> 'string' entao
erro("Tipo incorreto para funcao apare, espera-se uma strig");
fim
local strcorte = string.corte; //eficiencia rapidez por meio de var local
local ini = 1;
local final = #str;
//laço para inicio da string sem espacos
para i = 1 , #str inicio
local letra = strcorte(str, i , i);
se letra <> ' ' entao
ini = i; //se chega em uma letra marca o inicio e sai do laço
quebre; //sai do laco.
fim
//poe(letra);
fim//fim para
//laco para final da string excluindo espaços
para i = #str, 1, -1 inicio //-1 decrementa do final para o começo da string
local letra = strcorte(str, i , i);
se letra <> ' ' entao
final = i;
quebre;
fim
//poe (letra);
fim
// agora cortando a string no tamanho exato sem os espaços ao redor.
retorne strcorte(str , ini, final);//retornando a str pronta
fim
//testando, a str deve sair com os <<>> colados no inicio e fim sem espaços:
imprima( '<<' .. apare(str) .. '>>' );
Obs.: como uma função em Prisma também é uma variável, podemos reatribuir uma função em outra variável, é isto que fizemos em "local strcorte = string.corte"
e assim strcorte passa a ser uma função local, isso dá mais rapidez na execução do programa.
Obs.: os dois pontos seguidos .. servem para concatenar strings (unir).
Bem, é isso, bons estudos no código. Use a vontade, modifique, aprimore e mande-nos um feedback.
Site: http://linguagemprisma.br4.biz/blog/uncategorized/aparando-espacos-ao-redor-da-string-trim/ (http://linguagemprisma.br4.biz/blog/uncategorized/aparando-espacos-ao-redor-da-string-trim/)
Boa tarde Adalberto,
Recentemente tive um problema com essa função:
coloquei para aparar uma cadeia que só tinha espaços,
Quando eu coloquei pra concatenar ele deu concatenação de função.
Quando pedi pra mostrar o tipo ele mostrava string.
Não sei bem se isso é um erro ou uma falta de tratativa mesmo,
porque quando coloquei pra comparar se o valor era nulo antes de concatenar deu certo.
Tem como vc postar o trecho em que usa esta função?
Se preferir, use a nova função apare que desenvolvi em C, na biblioteca string (Prisma-1.0.100 ou superior);
Use: imprima( string.apare(" uma cadeia com espaços ao redor ") );
Testei aqui, e se tiver só espaços ela retorna toda a string sem modificá-la, fiz a correção abaixo:
//apare string (trim) string em prisma
funcao apare(str)
str = str ou '';
se tipo(str) <> 'string' entao
erro("Tipo incorreto para funcao apare, espera-se uma strig");
fim
local strcorte = string.corte; //eficiencia rapidez por meio de var local
local ini = 1;
local final = #str;
//laço para inicio da string sem espacos
para i = 1 , #str inicio
local letra = strcorte(str, i , i);
se letra <> ' ' entao
ini = i; //se chega em uma letra marca o inicio e sai do laço
quebre; //sai do laco.
fim
//poe(letra);
fim//fim para
//laco para final da string excluindo espaços
para i = #str, 1, -1 inicio //-1 decrementa do final para o começo da string
local letra = strcorte(str, i , i);
se letra <> ' ' entao
final = i;
quebre;
fim
//poe (letra);
fim
//=============== CASO TUDO SEJA ESPACO:
se ini == 1 e final == #str entao retorne ''; fim //retorna string vazia
// agora cortando a string no tamanho exato sem os espaços ao redor.
retorne strcorte(str , ini, final);//retornando a str pronta
fim
str = ' ';
//testando, a str deve sair com os <<>> colados no inicio e fim sem espaços:
imprima( '<<' .. apare(str) .. '>>' );
A tratativa que fiz já resolveu mas segue o código:
local tab_dados = {}; //criando uma tabela vazia. (matriz) para gravar as linhas
local cont = 1;//tabelas em Prisma começam por um e nao zero.
local a = es.pabra('echo "show sessions" | nc 127.0.0.1 2001') //'a' armazena a saída do comando
se a entao
enquanto 1 inicio
local lin = a:leia() //lê a primeira linha de 'a'
se nao lin entao quebre fim; //quebra o laço de repetição ao terminar as linhas.
se string.procure(lin, '|') entao // se a linha tiver '|' segue adiante
local t = string.analise(lin, '|'); //cada vez que tiver um '|' a cadeia é quebrada
se t[13]:apare() == 'active' entao t[13] = 'ativa' //traduzindo a saída
senaose t[13]:apare() == 'start' entao t[13] = 'aberta' //traduzindo a saída
senaose t[13]:apare() == 'finish' entao t[13] = 'caiu' //traduzindo a saída
fim
tab_dados[cont] = {}; //cada indice de tab.. é uma nova tabela.
tab_dados[cont].interface = t[1] //pega o valor de t[1]
se t[3] == ' ' entao tab_dados[cont].usuario = 'CONECTANDO'
senao tab_dados[cont].usuario = t[3]:apare() //pega o valor de t[3] caso exista
fim
tab_dados[cont].mac = t[5] //pega o valor de t[5]
tab_dados[cont].ip = t[7]
tab_dados[cont].estado = t[13]
tab_dados[cont].tempo = t[15]:apare()
cont = cont + 1; //incrementando para a proxima linha.
fim //se string.procure
fim //se nao lin
a:feche();
es.esvazie()
senao //se a
imprima("Erro ao ler dados")
sis.saia(1);
fim //se a