Pergunta

Quando estou executando a seguinte instrução:

@filtered = map {s/ //g} @outdata;

está retornando uma lista vazia em vez da lista filtrada que eu esperava.O que estou tentando fazer é remover todas as ocorrências de   de uma matriz de string (que é um arquivo XML).

Obviamente, não estou entendendo alguma coisa.Alguém pode me dizer a maneira correta de fazer isso e por que isso não está funcionando para mim como está?

Foi útil?

Solução

Tente isto:

@filtered = map {s/ //g; $_} @outdata;

O problema é que o operador s em perl modifica $ _ mas, na verdade, retorna o número de alterações que fez. Assim, o extra $ _ para as causas finais Perl para retornar a string modificada para cada elemento do @outdata.

Outras dicas

Note que o mapa vai modificar a sua matriz de origem também. Então você poderia fazer:

map {s/ //g} @outdata;

e ignorar a variável @filtered completamente, ou se você precisa manter os originais,

@filtered = @outdata;
map {s/ //g} @filtered;

Embora, nesse caso, pode ser mais legível para usar foreach:

s/ //g foreach @filtered;

A resposta de Greg tem o problema que ele irá modificar a matriz original como o $ _ são passados ??alias. Você precisa:

@filtered = map { (my $new = $_) =~ s/ //g; $new} @outdata;

Para dar seguimento a ponto de Tithonium, isto também irá fazer o truque:

@filtered = map {local $_=$_; s/ //g; $_} @outdata;

Os "locais" garante que você está trabalhando em uma cópia, não o original.

Em Perl 5.14 você poderia usar o / r regex modificador para tornar não-destrutivos substituição .

@filtered = map {s/ //gr} @outdata;
use Algorithm::Loops "Filter";
@filtered = Filter { s/ //g } @outdata;

Como contraponto a resposta de Greg, você pode abusar grep:

@filtered = grep {s/ //g; 1} @outdata;

Não faça isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top