私はperlコードを調べていて、これを見ています:
sub html_filter {
my $text = shift;
for ($text) {
s/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/g;
}
return $text;
}
この場合、for ループは何をし、なぜこのようにするのでしょうか?
for
ループは、ループするリストの各要素に エイリアス を付けます$_
。この場合、要素は 1 つだけ$text
です。
ボディ内で、これにより書き込みが可能になります
s/&/&/g;
書く代わりに
$text =~ s/&/&/g;
繰り返し。perldoc perlsynも参照してください。
Hewgill氏が指摘しているように、コードサンプルは、魔法の暗黙の変数である$_に暗黙的にローカライズおよびエイリアシングしています。
彼は、定型コードを犠牲にして、より読みやすい代替案を提供しています。
簡潔にするために読みやすさを犠牲にする理由はありません。暗黙的なローカリゼーションと割り当てを明示的なバージョンに置き換えるだけです。
sub html_filter {
local $_ = shift;
s/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/g;
return $_;
}
Perlをあまりよく知らず、このコードに出くわした場合は、のドキュメントを確認する必要があることを知っています。ボーナスとして$_
、ローカライズの例がいくつかあります。local
perlvar
$_
Perlを頻繁に使用する人にとって、上記は理解しやすいはずです。
したがって、ここで簡潔にするために読みやすさを犠牲にする理由は実際にはありません。
明示的なループ変数がない場合、for
ループは という特別な変数を使用します$_
。ループ内の置換ステートメントも、他に何も指定されていないため、特別な$_
変数を使用します。これは、ソース コードを短くするための単なるトリックです。私はおそらくこの関数を次のように書くでしょう:
sub html_filter {
my $text = shift;
$text =~ s/&/&/g;
$text =~ s/</</g;
$text =~ s/>/>/g;
$text =~ s/"/"/g;
return $text;
}
これはパフォーマンスに影響を与えず、Perl 以外の人でも読むことができます。
$text をデフォルト変数 $_ にエイリアスするために使用されます。怠惰すぎて明示的な変数を使用できないか、新しいスカラーを作成する貴重なサイクルを無駄にしたくないためです。
&、<、>、および引用符文字をクリーンアップし、適切な HTML エンティティ文字に置き換えます。
元のコードは、wantarray を使用して目的のコンテキストをテストすることで、より柔軟になる可能性があります。
sub html_filter {
my @text = @_;
for (@text) {
s/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/g;
}
return wantarray ? @text: "@text"; }
そうすれば、リスト コンテキストまたはスカラー コンテキストで呼び出して、正しい結果を返すことができます。次に例を示します。
my @stuff = html_filter('"','>');
print "$_\n" for @stuff;
my $stuff = html_filter('&');
print $stuff;
テキストをループし、アンパサンド (&) を & に、< を < に、> を > に、" を " に置き換えます。これを .html ドキュメントへの出力に使用します... これらは適切なエンティティ文字です。