Pregunta

Estoy mirando el código perl y veo esto:

sub html_filter {
    my $text = shift;
    for ($text) {
        s/&/&/g;
        s/</&lt;/g;
        s/>/&gt;/g;
        s/"/&quot;/g;
    }
    return $text;
}

¿Qué hace el bucle for en este caso y por qué lo haría de esta manera?

¿Fue útil?

Solución

Sin una variable de bucle explícito, el bucle for usa la variable especial llamada $_. Las declaraciones de sustitución dentro del bucle también usan la variable especial <=> porque no se especifica ninguna otra, por lo que esto es solo un truco para acortar el código fuente. Probablemente escribiría esta función 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;
}

Esto no tendrá consecuencias de rendimiento y puede ser leída por personas que no sean Perl.

Otros consejos

El bucle for alias a cada elemento de la lista que está pasando a $_. En este caso, solo hay un elemento, $text.

Dentro del cuerpo, esto permite escribir

s/&/&amp;/g;

etc. en lugar de tener que escribir

$text =~ s/&/&amp;/g;

repetidamente. Consulte también perldoc perlsyn .

Como señala el Sr. Hewgill, el ejemplo de código está localizando y alias implícitamente a $ _, la variable mágica implícita.

Ofrece un sustituto que es más legible a costa del código repetitivo.

No hay razón para sacrificar la legibilidad por brevedad. Simplemente reemplace la localización y asignación implícitas con una versión explícita:

sub html_filter {
    local $_ = shift;

    s/&/&amp;/g;
    s/</&lt;/g;
    s/>/&gt;/g;
    s/"/&quot;/g;

    return $_;
}

Si no conociera a Perl tan bien y me cruzara con este código, sabría que necesitaba consultar los documentos de $_ y local : como beneficio adicional en perlvar, hay algunos ejemplos de localización <= > .

Para cualquiera que use mucho Perl, lo anterior debería ser fácil de entender.

Entonces, realmente no hay razón para sacrificar la legibilidad por brevedad aquí.

Solo se usa para alias $ text a $ _, la variable predeterminada. Hecho porque son demasiado vagos para usar una variable explícita o no quieren perder preciosos ciclos creando un nuevo escalar.

Está limpiando & amp ;, < , > y citar caracteres y reemplazarlos con los caracteres de entidad HTML apropiados.

Recorre su texto y sustituye los símbolos (& amp;) con & amp; amp, < con & amp; lt, > con & amp; gt y " con & amp; quot. Haría esto para la salida a un documento .html ... esos son los caracteres de entidad adecuados.

El código original podría ser más flexible usando wantarray para probar el contexto deseado:

sub html_filter {
    my @text = @_;
    for (@text) {
        s/&/&amp;/g;
        s/</&lt;/g;
        s/>/&gt;/g;
        s/"/&quot;/g;
    }
    return wantarray ? @text: "@text"; }

De esa manera, podría llamarlo en contexto de lista o contexto escalar y obtener los resultados correctos, por ejemplo:

my @stuff = html_filter('"','>');
print "$_\n" for @stuff;

my $stuff = html_filter('&');
print $stuff;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top