Question

Je regarde à travers le code Perl et je vois ceci:

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

que fait la boucle for dans ce cas et pourquoi voudriez-vous le faire de cette façon?

Était-ce utile?

La solution

Sans variable de boucle explicite, la boucle for utilise la variable spéciale appelée $_. Les instructions de substitution à l'intérieur de la boucle utilisent également la variable <=> spéciale, car aucune autre n'est spécifiée. Il s'agit donc d'une astuce pour raccourcir le code source. J'écrirais probablement cette fonction en tant que:

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

Cela n'aura aucune conséquence sur les performances et sera lisible par des personnes autres que Perl.

Autres conseils

La boucle for aliase chaque élément de la liste en passant à $_. Dans ce cas, il n'y a qu'un seul élément, $text.

Dans le corps, cela permet d’écrire

s/&/&amp;/g;

etc. au lieu d'avoir à écrire

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

à plusieurs reprises. Voir aussi perldoc perlsyn .

Comme le fait remarquer M. Hewgill, l’exemple de code est en train de se localiser implicitement et est aliasé dans $ _, la variable implicite magique.

Il propose un substitut plus lisible au prix du code standard.

Il n'y a aucune raison de sacrifier la lisibilité pour la brièveté. Il suffit de remplacer la localisation et l’affectation implicites par une version explicite:

sub html_filter {
    local $_ = shift;

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

    return $_;
}

Si je ne connaissais pas très bien Perl et que je découvrais ce code, je saurais que je devais consulter la documentation $_ et local --comme un bonus dans perlvar, il existe quelques exemples de localisation <= > .

Pour ceux qui utilisent beaucoup Perl, ce qui précède doit être facile à comprendre.

Donc, il n'y a vraiment aucune raison de sacrifier la lisibilité pour la brièveté ici.

Il est simplement utilisé pour alias $ text en $ _, la variable par défaut. Fait parce qu'ils sont trop paresseux pour utiliser une variable explicite ou ne veulent pas gaspiller de précieux cycles en créant un nouveau scalaire.

Son nettoyage & amp ;, < , > et citez des caractères et les remplace par les caractères HTML appropriés.

Il parcourt votre texte et remplace les esperluettes (& amp;) par & amp; amp, < avec & amp; lt, > avec & amp; gt et " avec & amp; quot. Vous feriez ceci pour la sortie dans un document .html ... ce sont les caractères d'entité appropriés.

Le code d'origine pourrait être plus souple en utilisant wantarray pour tester le contexte souhaité:

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

De cette façon, vous pouvez l'appeler dans un contexte de liste ou un contexte scalaire et obtenir les résultats corrects, par exemple:

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

my $stuff = html_filter('&');
print $stuff;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top