Perl for循环解释

Tim*_*mmy 1 perl for-loop perlsyn

我正在查看perl代码,我看到了这个:

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

for循环在这种情况下做了什么,为什么你会这样做?

Sin*_*nür 8

for环路的别名其循环到列表中的每个元素$_.在这种情况下,只有一个元素,$text.

在体内,这允许一个人写

s/&/&amp;/g;
Run Code Online (Sandbox Code Playgroud)

而不是必须写

$text =~ s/&/&amp;/g;
Run Code Online (Sandbox Code Playgroud)

反复.另见perldoc perlsyn.


Gre*_*ill 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;
}
Run Code Online (Sandbox Code Playgroud)

这将没有性能影响,并且可由Perl以外的人阅读.


dao*_*oad 5

正如Hewgill先生所指出的那样,代码示例隐式地对@_这个神奇的隐含变量进行了本地化和别名化.

他提供了一种替代品,它以样板代码为代价更具可读性.

为简洁起见,没有理由牺牲可读性.只需用显式版本替换隐式本地化和赋值:

sub html_filter {
    local $_ = shift;

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

    return $_;
}
Run Code Online (Sandbox Code Playgroud)

如果我不太了解Perl并且遇到了这段代码,我就知道我需要查看文档$_并且 - local这是一个奖励perlvar,有一些本地化的例子$_.

对于任何使用Perl的人来说,上面应该很容易理解.

因此,为了简洁起见,没有理由牺牲可读性.

  • 在5.10你可以写我的$ _ (3认同)