[SP-pm] Ajuda com opção voltar em substituição interativa
Roberto Maluhy Junior
maluhy em gmail.com
Segunda Agosto 14 09:43:39 PDT 2006
Olá Senhores!
Venho mais uma vez requisitar ajuda.
Tenho uma substituição interativa, como o exemplo a seguir:
-----
$string = "Um abc-1 e mais um xyz-A, aqui termina a string";
$cnt = 0;
sub subst {
$cnt++;
$pos[$cnt] = pos $string;
# AQUI PERGUNTO SE O SUJEITO QUER FAZER A TROCA OU NÂO,
# OU AINDA "VOLTAR PARA A TROCA ANTERIOR CASO TENHA ESCOLHIDO A
# OPÇÂO SIM/NÃO ERRADA"
if (...opcao do usuario...)
... return $&; # SEM TROCA
... return "$1<hifen>$2"; # COM TROCA
... $voltar = 1; return ""; # VOLTAR
}
while ($string =~ s/([\w\d]*?)-([\w\d]*?)/&subst/esm) {
...
}
------
Como podem perceber, tenho um tipo de substituição interativa, que
funciona sem problema algum para respostas como SIM e NÃO. No entanto,
gostaria de criar um opção VOLTAR. Para fazer isso, tentei armazenar
todas as modificações (SIM/NÂO) feitas até então e automatizar as
substituições caso já tenham sido "memorizadas"; o problema é que não
consigo fazer a substituição voltar ao início da $string ou qualquer
outra posição quando é acionada a opção VOLTAR. Tentei os seguintes
códigos dentro do while():
---
while ($string =~ s/([\w\d]*?)-([\w\d]*?)/&subst/esm) {
if ($voltar) {
$voltar = 0;
$cnt -= 2;
$pos($string) = 0;
}
}
----
LABEL:
$pos($string) = 0;
while ($string =~ s/([\w\d]*?)-([\w\d]*?)/&subst/esm) {
if ($voltar) {
$voltar = 0;
$cnt -= 2;
goto LABEL;
}
}
-----
Se coloco um print dentro da função subst() imprimindo a posição "pos
$string;", percebo que a mesma não é zerada ou manualmente modificada
nunca, simplesmente vai mudando conforme o próximo match...
O que eu faço?
Agradeço qualquer ajuda.
Roberto
Mais detalhes sobre a lista de discussão SaoPaulo-pm