Estou tentando analisar uma seqüência de caracteres em Perl com o formato:
Messages pushed to the Order Book queues 123691 121574 146343 103046 161253
Eu quero acessar os números no final da string, então pretendo fazer uma correspondência como
/(d+)/s
Meu problema é que o número de valores no final contém um número variável de strings.
Qual é a melhor maneira de formatar o regexp para sercapaz de acessar cada um desses números individualmente? Sou desenvolvedor de C ++ e estou apenas aprendendo Perl, por isso estou tentando encontrar a maneira mais limpa de Perl para fazer isso.
Obrigado pela ajuda.
Respostas:
6 para resposta № 1Basta usar o sinalizador / g para fazer o operador de correspondência realizar uma correspondência global. No contexto da lista, o operador de correspondência retorna todos os resultados como uma lista:
@result = $string =~ /(d+)/g;
Isso funciona se não houver outros números além dos números finais.
4 para resposta № 2
Você pode usar o operador de correspondência em um contexto de lista com o sinalizador global para obter uma lista de todas as suas capturas entre parênteses. Exemplo:
@list = ($string =~ /(d+)/g);
Sua lista agora deve ter todos os grupos de dígitos em sua string. Consulte a documentação no operador de partida para mais informações.
1 para resposta № 3
"No contexto escalar, cada execução de m // g encontra a próxima correspondência, retornando verdadeiro se corresponder e falso se não houver mais correspondência" - (De perldoc perlop
)
Portanto, você deve poder fazer um loop regex global, assim:
while ($string =~ /(d+)/g) {
push @queuelist, $1;
}
0 para a resposta № 4
Eu faria algo assim:
my @numbers;
if (m/Messages pushed to the Order Book queues ([ds]+)/) {
@numbers = split(/s+/, $1);
}
Não há necessidade de amontoá-lo em uma regex.