No Perl, qual é uma boa maneira de executar uma substituição em uma string usando uma expressão regular e armazenar o valor em uma variável diferente, sem alterar o original?
Normalmente, apenas copio a string para uma nova variável e a s///
vinculo ao regex que substitui a nova string, mas queria saber se existe uma maneira melhor de fazer isso?
$newstring = $oldstring;
$newstring =~ s/foo/bar/g;
my $new = $_ for $old =~ s/foo/bar;
iria funcionar?s/foo/bar/ for my $newstring = $oldstring;
funciona, mas é muito mais estranho.A declaração:
O que equivale a:
Como alternativa, a partir do Perl 5.13.2, você pode usar
/r
para fazer uma substituição não destrutiva:fonte
g
no seu regex superior?Abaixo
use strict
, diga:em vez de.
fonte
A solução de uma linha é mais útil como shibboleth do que como um bom código; bons codificadores Perl o conhecerão e entenderão, mas é muito menos transparente e legível do que o dístico de duas linhas para copiar e modificar com o qual você está começando.
Em outras palavras, uma boa maneira de fazer isso é como você já está fazendo. Concisão desnecessária ao custo da legibilidade não é uma vitória.
fonte
Outra solução anterior à 5.14: http://www.perlmonks.org/?node_id=346719 (consulte a publicação do japhy)
Como sua abordagem usa
map
, também funciona bem para matrizes, mas requer cascatamap
para produzir uma matriz temporária (caso contrário, o original seria modificado):fonte
Eu odeio foo e bar .. quem inventou esses termos não descritivos em programação?
fonte
=~ s
.)newword donotnewword newword donotnewword newword donotnewword
foo
ebar
, sua resposta teria sido precisa. Provando, mais uma vez, os costumes existem por uma razão e as lições são aprendidas apenas da maneira mais difícil. ;)Se você escrever Perl
use strict;
, verá que a sintaxe de uma linha não é válida, mesmo quando declarada.Com:
Você obtém:
Em vez disso, a sintaxe que você está usando, enquanto uma linha mais longa, é a maneira sintaticamente correta de fazer isso
use strict;
. Para mim, usar agorause strict;
é apenas um hábito. Eu faço isso automaticamente. Todo mundo deveria.fonte
use warnings;
vez de-w
, obtém maior controle: por exemplo, se deseja desativar temporariamente os avisos em um bloco de código.