Frage

Ich bin auf der Suche durch perl-code, und ich sehe dies:

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

was macht die for-Schleife in diesem Fall zu tun und warum würden Sie es auf diese Weise?

War es hilfreich?

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

usw. statt schreiben

$text =~ s/&/&amp;/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/&/&amp;/g;
    s/</&lt;/g;
    s/>/&gt;/g;
    s/"/&quot;/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, mit > und "mit ". Sie würden es ein .html Dokument für die Ausgabe zu tun ... das sind die richtigen Zeichen Einheit .

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/&/&amp;/g;
        s/</&lt;/g;
        s/>/&gt;/g;
        s/"/&quot;/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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top