2009-06-18 96 views
1

我期待通過Perl代碼,我看到:Perl的for循環的解釋

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

什麼的for循環在這種情況下做的,爲什麼你會做這種方式?

回答

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以外的人閱讀。

+0

你喜歡樣板嗎? – Svante 2009-06-18 22:22:04

+0

你是否暗示原作不可讀? – 2009-06-19 16:31:12

2

它只是用來將$ text替換爲默認變量$ _。完成是因爲他們懶得使用顯式變量或不想浪費寶貴的週期來創建新的標量。

2

它的清理&,<,>和引用字符,並用適當的HTML實體字符替換它們。

8

for循環會將列表中的每個元素別名循環到$_。在這種情況下,只有一個元素$text

在體內,這允許一個寫

s/&/&amp;/g; 

等,而不必編寫

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

反覆。另見perldoc perlsyn

+1

但是,這種編碼正是你想要的。該功能使用未編碼的數據並對其進行編碼。如果字符串「&」出現在未編碼的文本中,則編碼結果肯定應該是「& amp;」。 – 2009-06-18 21:51:12

+0

將&轉換爲& amp;有時候是你想要的。 html_filter將轉義xml/html/xhtml,以便瀏覽器以您可以閱讀的方式呈現xml,對代碼示例很有用,例如, – 2009-06-18 21:51:56

1

它通過循環文字和替代符號(&)與&放大器,<與& LT,>與& GT和「與& QUOT。你會輸出這樣做是爲了一個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是正確的結果,例如:

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

my $stuff = html_filter('&'); 
print $stuff; 
5

由於Hewgill先生所指出的,該代碼示例是隱式定位和混疊$ _,神奇的隱含變量。

他提供了一個替代品,代價是樣板代碼更易讀。

爲簡潔起見,沒有理由犧牲可讀性。只需更換隱含的定位和分配有明確的版本:

sub html_filter { 
    local $_ = shift; 

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

    return $_; 
} 

如果我不知道的Perl那麼好和跨越這些代碼來了,我就知道,我需要看看文檔爲$_local - 作爲perlvar的獎勵,有幾個examples of localizing $_

對於任何使用Perl的人來說,上面應該很容易理解。

所以在這裏沒有理由爲了簡潔而犧牲可讀性。