Perl for循环解释

时间:2009-06-18 21:42:01

标签: 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;
}

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

7 个答案:

答案 0 :(得分:8)

for循环将列表的每个元素别名化为$_。在这种情况下,只有一个元素$text

在体内,这允许人们写

s/&/&amp;/g;

等。而不是必须写

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

反复。另请参阅perldoc perlsyn

答案 1 :(得分: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以外的人可以读取。

答案 2 :(得分:5)

正如Hewgill先生所指出的那样,代码示例隐式地本地化和别名为$ _,这是一个神奇的隐含变量。

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

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

sub html_filter {
    local $_ = shift;

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

    return $_;
}

如果我没有完全了解Perl并遇到此代码,我知道我需要查看$_local的文档 - 作为{ {1}},有一些examples of localizing $_

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

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

答案 3 :(得分:2)

它只是用于将$ text别名为$ _,默认变量。完成是因为他们懒得使用显式变量或者不想浪费宝贵的周期来创建新的标量。

答案 4 :(得分:2)

清理&amp;,&lt; ,&gt;引用字符并用适当的HTML实体字符替换它们。

答案 5 :(得分:1)

它循环播放你的文字并用&amp; amp替换&符号(&amp;),&lt;与&amp; lt,&gt;使用&amp; gt和“with&amp; quot。你可以输出到.html文档...这些是正确的实体字符。

答案 6 :(得分: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;