Perl for-Schleife Erklärung
Frage
Ich bin auf der Suche durch perl-code, und ich sehe dies:
sub html_filter {
my $text = shift;
for ($text) {
s/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/g;
}
return $text;
}
was macht die for-Schleife in diesem Fall zu tun und warum würden Sie es auf diese Weise?
Lösung
Ohne eine explizite Schleifenvariable verwendet die for
Schleife die besondere Variable namens $_
. Die Substitution Anweisungen innerhalb der Schleife auch verwenden, um die speziellen $_
variabel, da keine anderen angegeben ist, so ist dies nur ein Trick, den Quellcode zu verkürzen. Ich würde schreiben wahrscheinlich diese Funktion als:
sub html_filter {
my $text = shift;
$text =~ s/&/&/g;
$text =~ s/</</g;
$text =~ s/>/>/g;
$text =~ s/"/"/g;
return $text;
}
Dies wird keine Leistung Folgen hat und lesbar ist von anderen Menschen als Perl.
Andere Tipps
Der for
Schleife Aliase jedes Element der Liste über die Schleife $_
. In diesem Fall gibt es nur ein Element, $text
.
Innerhalb des Körpers, ermöglicht dies einen schreiben
s/&/&/g;
usw. statt schreiben
$text =~ s/&/&/g;
wiederholt. Siehe auch Perldoc perlsyn .
Als Herr Hewgill Punkte aus, die code-Beispiel wird implizit lokalisieren und aliasing",$_, die Magische implizite variable.
Er bietet Ersatz, die ist mehr lesbar auf Kosten von boilerplate-code.
Es gibt keinen Grund, Sie zu opfern Lesbarkeit der Kürze halber.Ersetzen Sie einfach die implizite Lokalisierung und Zuordnung einer expliziten version:
sub html_filter {
local $_ = shift;
s/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/g;
return $_;
}
Wenn ich nicht weiß, Perl-alle, die gut und bin auf diesen code, ich würde wissen, dass ich brauchte, um Blick auf die Dokumentation für $_
und local
--als bonus perlvar
, gibt es ein paar Beispiele lokalisieren $_
.
Für jeden, der mit Perl-viel, das soll einfach zu verstehen.
Es gibt also wirklich keinen Grund, Sie zu opfern Lesbarkeit der Kürze wegen hier.
Es ist einfach zu alias $ Text $ verwendet _, das Standard-Variable. Geschehen, weil sie zu faul sind eine explizite Variable zu verwenden oder nicht wollen, wertvolle Zyklen verschwenden einen neuen Skalar zu schaffen.
Die Säuberung &, <,> und Anführungszeichen und sie mit den entsprechenden HTML-Entität Zeichen ersetzt werden.
Es Schleifen durch Ihren Text und Ersatz Et-Zeichen (&) mit & amp,
Der ursprüngliche Code könnte flexibler gestaltet werden, indem Sie wantarray den gewünschten Kontext zu testen:
sub html_filter {
my @text = @_;
for (@text) {
s/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/g;
}
return wantarray ? @text: "@text"; }
So können Sie es im Listenkontext oder Skalarkontext nennen könnten und die richtigen Ergebnisse zurück, zum Beispiel:
my @stuff = html_filter('"','>');
print "$_\n" for @stuff;
my $stuff = html_filter('&');
print $stuff;