【问题标题】:Perl for loop explanationPerl for 循环解释
【发布时间】:2010-11-04 03:52:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: perl for-loop perlsyn


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      它清理 &、 和引号字符,并用适当的 HTML 实体字符替换它们。

      【讨论】:

        【解决方案3】:

        没有显式循环变量,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 以外的人也可以阅读。

        【讨论】:

        • 您是在暗示人们无法阅读原文吗?
        【解决方案4】:

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

        在正文中,这允许人们编写

        s/&/&amp;/g;
        

        等等。而不是必须写

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

        反复。另见perldoc perlsyn

        【讨论】:

        • 这种编码正是你想要的。此函数获取未编码的数据并对其进行编码。如果字符串“&”出现在未编码的文本中,那么编码的结果肯定应该是“&amp;”。
        • 车削 &进入&amp;有时是你想要的。 html_filter 将转义 xml/html/xhtml 以便浏览器以您可以阅读的方式呈现 xml,这对于代码示例很有用,例如
        • 从 Template::Toolkit 复制它。每天学习新东西!
        【解决方案5】:

        它遍历您的文本并用 &amp 代替 & 符号,用 &lt 代替

        【讨论】:

          【解决方案6】:

          原来的代码可以通过使用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;
          

          【讨论】:

          • 有关 wantarray() 的弊端/优点的有趣讨论,请参阅perlmonks.org/?node_id=729965
          • @daotoad... 有趣的是正确的词。一个充满意见的线程,支持和反对处理上下文的各种不同问题。最后,这一切似乎加起来为零。但这很有趣。
          【解决方案7】:

          正如 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 的人来说,上面的内容应该很容易理解。

          因此,这里确实没有理由为了简洁而牺牲可读性。

          【讨论】:

          • 我喜欢你的观察,除了它需要标量上下文......开个玩笑。 "local $_" 代替 "for($text)" 块不仅更简单,而且对我来说实际上更有意义。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-08-20
          • 2023-01-07
          • 2023-04-10
          • 2013-08-31
          • 1970-01-01
          • 2016-07-11
          • 1970-01-01
          相关资源
          最近更新 更多