2009-06-18 13 views
1

Ich bin auf der Suche durch Code Perl und ich sehe dies:Perl for-Schleife Erklärung

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

, was in diesem Fall zu tun ist die for-Schleife und warum sollten Sie es auf diese Weise tun?

Antwort

5

Ohne eine explizite Schleifenvariable verwendet die Schleife for die spezielle Variable $_. Die Substitutionsanweisungen in der Schleife auch verwenden die spezielle $_ Variable, weil keine andere angegeben ist, so ist dies nur ein Trick, um den Quellcode kürzer zu machen. Ich würde wahrscheinlich diese Funktion schreiben als:

Dies wird keine Auswirkungen auf die Leistung haben und ist lesbar von anderen Menschen als Perl.

+0

Sie mögen Boilerplate? – Svante

+0

Meinst du, dass das Original von Menschen nicht lesbar war? –

2

Es wird nur verwendet, um $ text an $ _, die Standardvariable, zu aliasieren. Fertig, weil sie zu faul sind, eine explizite Variable zu verwenden oder wertvolle Zyklen nicht zu verschwenden, um einen neuen Skalar zu erstellen.

2

Ihre Aufräumarbeiten &, <,> und zitieren Zeichen und ersetzen sie durch die entsprechenden HTML-Entity-Zeichen.

8

Die for Schleife alias jedes Element der Liste seine Schleife über $_. In diesem Fall gibt es nur ein Element, $text.

Innerhalb des Körpers ermöglicht dies eine

s/&/&amp;/g; 

usw. statt

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

wiederholt zu schreiben, zu schreiben. Siehe auch perldoc perlsyn.

+1

Diese Codierung ist jedoch genau das, was Sie wollen. Diese Funktion übernimmt nicht codierte Daten und codiert sie. Wenn die Zeichenfolge "&" im unverschlüsselten Text erscheint, sollte das codierte Ergebnis definitiv "& amp;" sein. –

+0

Drehen & in & Ampere; ist manchmal was du willst. html_filter entkommt xml/html/xhtml, so dass der Browser die XML-Datei in einer Weise rendert, die Sie lesen können, nützlich für Code-Beispiele, z. –

+0

Kopierte es von Template :: Toolkit. Lerne jeden Tag etwas Neues! – Timmy

1

Es Schleifen durch Ihren Text und Ersatz Et-Zeichen (&) mit & amp, < mit & lt,> mit & gt und "mit & quot. Sie würden es ein .html Dokument für die Ausgabe tun ... diejenigen, Zeichen sind die richtigen Entität

1

Der ursprüngliche Code unter Verwendung wantarray flexibler sein könnte 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"; } 

diese Weise können Sie es im Listenkontext oder Skalarkontext nennen könnte und bac bekommen k die richtigen Ergebnisse, zum Beispiel:

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

my $stuff = html_filter('&'); 
print $stuff; 
+1

Für eine interessante Diskussion über die Übel/Vorzüge von willarray() siehe http://www.perlmonks.org/?node_id=729965 – daotoad

+0

@daotoad ... interessant ist das richtige Wort. Ein roter Faden voller Meinungen, sowohl für als auch gegen eine Vielzahl unterschiedlicher Themen, die sich mit dem Kontext befassen. Am Ende scheint alles auf Null zu kommen. Aber es ist interessant. – user118435

5

Wie Herr Hewgill weist darauf hin, wird der Code Probe implizit lokalisierende und Aliasing zu $ ​​_, die magische implizite Variable.

Er bietet einen Ersatz, der auf Kosten des Boilerplate-Codes lesbarer ist.

Es gibt keinen Grund, die Lesbarkeit der Kürze zu opfern.Ersetzen Sie einfach die implizite Lokalisierung und Zuordnung mit einer expliziten Version:

sub html_filter { 
    local $_ = shift; 

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

    return $_; 
} 

Wenn ich nicht Perl alles gut kannte, und kam in diesem Code, würde ich weiß, dass ich für $_ bei der Dokumentation suchen benötigt und local - als Bonus in perlvar gibt es ein paar examples of localizing $_.

Für alle, die Perl viel verwenden, sollte das oben genannte einfach zu verstehen sein.

Es gibt also wirklich keinen Grund, hier auf die Lesbarkeit zu verzichten.

+1

Ich mag deine Beobachtungen, alle außer dass es skalaren Kontext erfordert ..... nur Spaß. "local $ _" anstelle des "for ($ text)" -Blocks ist nicht nur ein bisschen mehr Succinet, sondern macht mir mehr Sinn. – user118435

+3

In 5.10 können Sie mein $ _ schreiben –