Domanda

Sto cercando il codice perl e vedo questo:

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

cosa fa il ciclo for in questo caso e perché dovresti farlo in questo modo?

È stato utile?

Soluzione

Senza una variabile di ciclo esplicita, il ciclo for utilizza la variabile speciale chiamata $_. Le istruzioni di sostituzione all'interno del ciclo anche usano la speciale variabile <=> perché non è stata specificata nessuna altra, quindi questo è solo un trucco per accorciare il codice sorgente. Probabilmente scriverei questa funzione come:

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

Ciò non avrà conseguenze sulle prestazioni ed è leggibile da persone diverse da Perl.

Altri suggerimenti

Il ciclo for alias ogni elemento dell'elenco si sovrappone a $_. In questo caso, c'è solo un elemento, $text.

All'interno del corpo, questo permette di scrivere

s/&/&amp;/g;

ecc. invece di dover scrivere

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

ripetutamente. Vedi anche perldoc perlsyn .

Come sottolinea Hewgill, l'esempio di codice sta implicitamente localizzando e aliasing in $ _, la variabile implicita magica.

Offre un sostituto più leggibile a scapito del codice del bollettino.

Non c'è motivo di sacrificare la leggibilità per brevità. Sostituisci semplicemente la localizzazione e l'assegnazione implicite con una versione esplicita:

sub html_filter {
    local $_ = shift;

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

    return $_;
}

Se non conoscessi Perl così bene e mi imbattessi in questo codice, saprei che dovevo guardare i documenti per $_ e local - come bonus in perlvar, ci sono alcuni esempi di localizzazione <= > .

Per chiunque usi molto Perl, quanto sopra dovrebbe essere facile da capire.

Quindi non c'è davvero alcun motivo per sacrificare la leggibilità per la brevità qui.

È solo usato per alias $ text su $ _, la variabile predefinita. Fatto perché sono troppo pigri per usare una variabile esplicita o non vogliono sprecare cicli preziosi creando un nuovo scalare.

Sta pulendo & amp ;, < , > e citare i caratteri e sostituirli con i caratteri entità HTML appropriati.

Passa attraverso il testo e sostituisce le e commerciali (& amp;) con & amp; amp, < con & amp; lt, > con & amp; gt e " con & amp; quot. Lo faresti per l'output in un documento .html ... quelli sono i caratteri entità appropriati.

Il codice originale potrebbe essere più flessibile usando wantarray per testare il contesto desiderato:

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

In questo modo è possibile chiamarlo nel contesto dell'elenco o nel contesto scalare e ottenere i risultati corretti, ad esempio:

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

my $stuff = html_filter('&');
print $stuff;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top