Perl para a explicação de loop
Pergunta
Eu estou olhando através de código Perl e eu vejo isso:
sub html_filter {
my $text = shift;
for ($text) {
s/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/g;
}
return $text;
}
O que o loop for fazer neste caso e por que você fazê-lo desta maneira?
Solução
Sem uma variável de laço explícita, o loop for
usa a variável especial chamada $_
. As declarações de substituição dentro do loop também usar a variável $_
especial porque nenhum outro é especificado, então este é apenas um truque para tornar o código fonte mais curto. Eu provavelmente iria escrever esta função como:
sub html_filter {
my $text = shift;
$text =~ s/&/&/g;
$text =~ s/</</g;
$text =~ s/>/>/g;
$text =~ s/"/"/g;
return $text;
}
Esta não terá consequências desempenho e pode ser lido por outras pessoas do que Perl.
Outras dicas
O loop for
aliases cada elemento da lista de seu looping sobre a $_
. Neste caso, não é apenas um elemento, $text
.
Dentro do corpo, isso permite que se escreva
s/&/&/g;
etc. em vez de ter que escrever
$text =~ s/&/&/g;
repetidamente. Veja também perldoc perlsyn .
Como aponta o Sr. Hewgill, o exemplo de código é localizar implícita e aliasing para $ _, a variável implícita mágico.
Ele oferece um substituto que é mais legível ao custo de código clichê.
Não há nenhuma razão para sacrificar a legibilidade para a brevidade. Basta substituir a localização implícita e atribuição com uma versão explícita:
sub html_filter {
local $_ = shift;
s/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/g;
return $_;
}
Se eu não sabia Perl tão bem e me deparei com este código, eu sei que eu precisava olhar para a documentação para $_
e local
--como um bônus em perlvar
, há alguns exemplos de localizar $_
.
Para qualquer um que usa Perl muito, o acima deve ser fácil de entender.
Portanto, não há realmente nenhuma razão para sacrificar a legibilidade para a brevidade aqui.
É apenas usado para apelido $ texto para $ _, a variável padrão. Feito porque eles são preguiçosos demais para usar uma variável explícita ou não quer desperdiçar ciclos preciosos criação de um novo escalar.
A sua limpeza e, <,> e os caracteres de citação e substituí-los com os caracteres entidade HTML apropriado.
Ele percorre o seu texto e substitutos comercial (&) com & amp,
O código original poderia ser mais flexível usando wantarray para testar o contexto desejado:
sub html_filter {
my @text = @_;
for (@text) {
s/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/g;
}
return wantarray ? @text: "@text"; }
Dessa forma, você poderia chamá-lo no contexto de lista ou contexto escalar e voltar os resultados corretos, por exemplo:
my @stuff = html_filter('"','>');
print "$_\n" for @stuff;
my $stuff = html_filter('&');
print $stuff;