[SP-pm] Ajuda com opção voltar em substituição interativa

Roberto Maluhy Junior maluhy em gmail.com
Domingo Agosto 13 17:40:01 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