1

私はperlコードを調べていて、これを見ています:

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

この場合、for ループは何をし、なぜこのようにするのでしょうか?

4

7 に答える 7

8

forループは、ループするリストの各要素に エイリアス を付けます$_。この場合、要素は 1 つだけ$textです。

ボディ内で、これにより書き込みが可能になります

s/&/&amp;/g;

書く代わりに

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

繰り返し。perldoc perlsynも参照してください。

于 2009-06-18T21:45:48.000 に答える
5

Hewgill氏が指摘しているように、コードサンプルは、魔法の暗黙の変数である$_に暗黙的にローカライズおよびエイリアシングしています。

彼は、定型コードを犠牲にして、より読みやすい代替案を提供しています。

簡潔にするために読みやすさを犠牲にする理由はありません。暗黙的なローカリゼーションと割り当てを明示的なバージョンに置き換えるだけです。

sub html_filter {
    local $_ = shift;

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

    return $_;
}

Perlをあまりよく知らず、このコードに出くわした場合は、のドキュメントを確認する必要があることを知っています。ボーナスとして$_ローカライズの例がいくつかあります。localperlvar$_

Perlを頻繁に使用する人にとって、上記は理解しやすいはずです。

したがって、ここで簡潔にするために読みやすさを犠牲にする理由は実際にはありません。

于 2009-06-19T03:44:07.340 に答える
5

明示的なループ変数がない場合、forループは という特別な変数を使用します$_。ループ内の置換ステートメント、他に何も指定されていないため、特別な$_変数を使用します。これは、ソース コードを短くするための単なるトリックです。私はおそらくこの関数を次のように書くでしょう:

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

これはパフォーマンスに影響を与えず、Perl 以外の人でも読むことができます。

于 2009-06-18T21:45:03.213 に答える
2

$text をデフォルト変数 $_ にエイリアスするために使用されます。怠惰すぎて明示的な変数を使用できないか、新しいスカラーを作成する貴重なサイクルを無駄にしたくないためです。

于 2009-06-18T21:44:54.383 に答える
2

&、<、>、および引用符文字をクリーンアップし、適切な HTML エンティティ文字に置き換えます。

于 2009-06-18T21:45:00.980 に答える
1

元のコードは、wantarray を使用して目的のコンテキストをテストすることで、より柔軟になる可能性があります。

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

そうすれば、リスト コンテキストまたはスカラー コンテキストで呼び出して、正しい結果を返すことができます。次に例を示します。

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

my $stuff = html_filter('&');
print $stuff;
于 2009-06-18T23:27:41.913 に答える
1

テキストをループし、アンパサンド (&) を & に、< を < に、> を > に、" を " に置き換えます。これを .html ドキュメントへの出力に使用します... これらは適切なエンティティ文字です。

于 2009-06-18T21:45:59.950 に答える