Perl para la explicación del bucle
Pregunta
Estoy mirando el código perl y veo esto:
sub html_filter {
my $text = shift;
for ($text) {
s/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/g;
}
return $text;
}
¿Qué hace el bucle for en este caso y por qué lo haría de esta manera?
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/&/&/g;
$text =~ s/</</g;
$text =~ s/>/>/g;
$text =~ s/"/"/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/&/&/g;
etc. en lugar de tener que escribir
$text =~ s/&/&/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/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/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/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/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;