Perl per spiegazione del ciclo
Domanda
Sto cercando il codice perl e vedo questo:
sub html_filter {
my $text = shift;
for ($text) {
s/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/g;
}
return $text;
}
cosa fa il ciclo for in questo caso e perché dovresti farlo in questo modo?
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/&/&/g;
$text =~ s/</</g;
$text =~ s/>/>/g;
$text =~ s/"/"/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/&/&/g;
ecc. invece di dover scrivere
$text =~ s/&/&/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/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/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/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/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;