2009-06-18 8 views
1

のために私はPerlのコードを見ていると私はこれを参照してください。は、Perlのループ説明

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

ループのため、この場合に何をするのか、あなたがそれこの方法なぜだろうか?

答えて

5

ループ変数が明示されていない場合、forループには$_という特殊変数が使用されます。ループ内の置換ステートメントでもは特別な$_変数を使用します。これは他に何も指定されていないためです。ソースコードを短くするのは単なるトリックです。これは、パフォーマンス上の影響がないとPerl以外の人によって読み取り可能であるだろう

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

:私はおそらく、この関数を記述します。

+0

あなたは定型文が好きですか? – Svante

+0

元が人によって読めないと言っていますか? –

2

これは、$ textをデフォルト変数のエイリアスに使用しただけです。明示的な変数を使用するにはあまりにも怠惰であるか、新しいスカラーを作成する貴重なサイクルを無駄にしたくないため、完了します。

2

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

8

forループの各要素は、リストの各要素にループし、$_にループします。この場合、1つの要素、$textのみが存在します。本体内

が、これは、1つの代わりに繰り返し

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

を記述することで

s/&/&amp;/g; 

等を記述することを可能にします。 perldoc perlsynも参照してください。

+1

そのエンコーディングはまさにあなたが望むものです。この関数は、エンコードされていないデータを取り込み、エンコードします。文字列 "&"がエンコードされていないテキストに表示される場合、エンコードされた結果は "& amp;"になるはずです。 –

+0

&を& amp;時にはあなたが望むものです。 html_filterは、xml/html/xhtmlをエスケープします。これにより、ブラウザがxmlを読み込み可能な形でレンダリングし、コードサンプルに便利です。 –

+0

Template :: Toolkitからコピーしました。新しいものを毎日学ぶ! – Timmy

1

それは、& GTと「& QUOTとして>、&アンプ、& LTと<を使用してテキストや代替アンパサンド(&)をループします。あなたが.htmlの文書への出力のためにこれを行うだろう...それら適切なエンティティの文字がある

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"; } 

あなたはリストコンテキストまたはスカラーコンテキストでそれを呼び出すと、BACを得ることができ、そのように例えば、正しい結果をk個:ミスターHewgillが指摘するように、コードサンプルは、暗黙的にローカライズし、$ _、魔法のような暗黙の変数にエイリアシングされ

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

my $stuff = html_filter('&'); 
print $stuff; 
+1

wantarray()の邪悪/メリットの興味深い議論についてはhttp://www.perlmonks.org/?node_id=729965を参照してください。 – daotoad

+0

@daotoad ...興味深いのは正しい言葉です。文脈を扱うさまざまな異なる問題に対して、または反対に意見がいっぱいのスレッド。結局それはすべてゼロになるようです。しかしそれは面白いです。 – user118435

5

彼は、定型句コードの代償で読みやすい代替品を提供しています。

簡潔にするために読みやすさを犠牲にする理由はありません。単に明示バージョンで暗黙のローカリゼーションと割り当てを置き換える:私はすべてのことだけでなくPerlを知っていて、このコードに出くわしていない場合は

sub html_filter { 
    local $_ = shift; 

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

    return $_; 
} 

、私は$_のためにドキュメントを見て必要なことを知っているだろうし、 local - perlvarにボーナスとして、examples of localizing $_が少しあります。

Perlをたくさん使っている人にとっては、上記は理解しやすいはずです。

ここでは、簡潔さのために読みやすさを犠牲にする理由はありません。

+1

私はあなたの観察が好きですが、スカラーのコンテキストが必要だということ以外はすべて冗談です。 "for $ text"ブロックの代わりに "local $ _"はもう少しsuccinetであるだけでなく、実際にはもっと意味があります。 – user118435

+3

5.10では、私の$ _ –