Estou tentando capturar a posição de todos os hifens em uma palavra hifenizada, para que eu possa carregar um hash com a posição desses hifens (no texto, não na palavra). No momento, estou tentando um grupo de captura dentro de um grupo sem captura... mas ele está capturando apenas o último hífen.
my $word = shift (@_);
my $word_start_pos = shift (@_);
my $text = shift (@_);
my $dash_pos = 0;
my $exp = 0;
my $pos = 0;
my $test_char = '';
if ($word =~ /^(?:[\p{L&}0-9\.\'\/]{1,}([\-])){7,}[\p{L&}0-9\.\'\/]{1,}$/) {
foreach $exp (1..$#-) {
$pos = $-[$exp];
$dash_pos = $word_start_pos + $pos;
$test_char = substr($text, $dash_pos, 1);
if ($test_char =~ /^[\-]$/) {
&load_changes('-', $dash_pos, 'Dash', ' ', 'Replace');
}
}
}
Demonstração:
No contexto, você poderia substituir
com
Não vejo nenhum benefício em usar regexes para essa tarefa. Não é uma ferramenta que seja adequada para o trabalho. Aqui estão duas abordagens alternativas que são muito mais simples e eficientes:
Saída:
(Observe que as posições são baseadas em 0.)
Provavelmente não é a melhor ideia redefinir manualmente a
pos
variável. Basicamente, o que isso faz é fazer uma correspondência global pular para frente e para trás em uma string em vez de processá-la do começo ao fim.Este é um uso direto dos arrays
@-
e@+
, que funcionam em conjunto com opos
valor.@+
é equivalente aopos
valor de cada partida. Parece que você quer o@-
valor.Aqui está o código...
A saída se parece com isso...
Jogou golfe com 54 caracteres