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/</&lt;/g;
        s/>/&gt;/g;
        s/"/&quot;/g;
    }
    return $text;
}

O que o loop for fazer neste caso e por que você fazê-lo desta maneira?

Foi útil?

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/&/&amp;/g;
    $text =~ s/</&lt;/g;
    $text =~ s/>/&gt;/g;
    $text =~ s/"/&quot;/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/&/&amp;/g;

etc. em vez de ter que escrever

$text =~ s/&/&amp;/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/&/&amp;/g;
    s/</&lt;/g;
    s/>/&gt;/g;
    s/"/&quot;/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, com & gt e "com & quot. Você faria isso para a saída a um documento .html ... esses são os personagens órgão competente .

O código original poderia ser mais flexível usando wantarray para testar o contexto desejado:

sub html_filter {
    my @text = @_;
    for (@text) {
        s/&/&amp;/g;
        s/</&lt;/g;
        s/>/&gt;/g;
        s/"/&quot;/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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top