【问题标题】:How can I add a newline after X number of characters in Perl?如何在 Perl 中 X 个字符后添加换行符?
【发布时间】:2009-10-01 07:47:50
【问题描述】:

我想知道如何在 X 个字符后添加换行符(即 /n<br>)。

例如,假设我有一个 perl 变量 $message ="aaaaabbbbbcccccdd"。我想在这个变量的每 5 个字符之后添加一个换行符。因此,当我在 html 中打印变量时,它将显示:

aaaaa 
bbbbb 
ccccc 
dd    

最好的方法是什么?有人告诉我使用 substr 或 count 函数,但我不知道该怎么做。任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: perl


    【解决方案1】:

    一个更短的选项。

    $m = "aaaaabbbbbcccccdd";
    $m =~ s/(.{1,5})/$1\n/gs;
    print $m;
    

    输出:

    aaaaa
    bbbbb
    ccccc
    dd
    

    当然,我认为我的版本是迄今为止最好的版本。 ;)

    【讨论】:

    • @roddick:你需要得到最后一组,可能不是五个字符。
    • @RobertP - 您可以轻松使用 .{5} - .{1,5} 不需要
    • 使用 .{5} 对我有用。最初,我将 dd
      作为输出,但如果剩余字符少于 5 个,则不需要换行符。我只是编辑了输出以避免任何混淆。感谢大家的贡献。
    • .{5} 工作正常;我最初的 cmets 现在已被删除,并且不准确。
    【解决方案2】:

    听说最有效的方法是使用unpack:

    say for unpack "(A5)*", "012345678901234567890123456879"
    

    输出:

    01234
    56789
    01234
    56789
    01234
    56879
    

    【讨论】:

    • 这是 unpack 的一个有趣用途。我喜欢。它比正则表达式版本干净得多。
    • 除非它没有将它添加到变量中。您需要稍作改动才能使其发挥作用。
    • 如果你想将<br>s 添加到变量中,你必须执行类似 $x = join "
      \n", unpack '(A5)*', $x
    【解决方案3】:

    基于马萨的回答,我会这样做:

    $message = join("\n", unpack('(A5)*', $message ))
    

    运行它,

    $ perl
    use strict;
    use warnings;
    
    my $message = "aaaaabbbbbcccccdd";
    
    $message = join("\n", unpack("(A5)*", $message));
    print $message;
    ^D
    aaaaa
    bbbbb
    ccccc
    dd
    

    将“\n”替换为您想要实际终止每一行的任何内容(例如,“\
    \n”。)

    【讨论】:

      【解决方案4】:

      在 perl 中,有很多方法可以完成同样的事情 ;-)

      其中一个可能是:

      $message = "aaaaabbbbbcccccdd";
      $splitmessage = join ("\n",  ( $message =~ /.{1,5}/gs ));
      print $splitmessage, "\n";
      

      输出:

      aaaaa
      bbbbb
      ccccc
      dd
      

      【讨论】:

        【解决方案5】:

        由于您似乎正在尝试换行,因此我会查看 Text::Wrap 之类的内容

        【讨论】:

          【解决方案6】:

          unpack 方法可能是最有效的,虽然有点迟钝。正则表达式方法可能是最 Perlish 的方法。但由于这是 Perl,有不止一种方法可以做到这一点,所以这里有一些其他有趣的方法可以做到这一点:

          使用List::MoreUtils::natatime ("n-at-a-time")。这种方法当然会非常浪费内存,为字符串中的每个字符创建一个标量。

          use List::MoreUtils qw(natatime);
          
          my $in = "aaaaabbbbbcccccdd";
          my $out = '';
          
          my $it = natatime 5, split //, $in;
          while(my @chars = $it->()) {
              $out .= $_ for @chars;
              $out .= "\n";
          }
          

          使用substr 的“替换”参数拼接换行符,从头开始工作:(您必须从头开始工作,否则在开始添加换行符后进一步的偏移量不再排列;也从头开始工作意味着您只在循环开始时计算length $in,而不使用额外的变量)

          for(my $i = length($in) - length($in) % 5; $i; $i -= 5) {
              substr($in, $i, 0, "\n");
          }
          

          如果您想保持输入变量不变,您可以预先计算所有偏移量并使用substr提取它们

          foreach (map $_ * 5, 0 .. int(length($in) / 5)) {
              $out .= substr($in, $_, 5) . "\n";
          }
          

          使用substr 的最简洁的方法可能是使用替换并连接返回值:

          $out .= substr($in, 0, 5, '') . "\n" while $in;
          

          【讨论】:

            【解决方案7】:
            substr($string, 0, 5);
            

            加上一些变量:

            $x = 0;
            $newstring = '';
            while(length($string)<$x){
                $newstring = $newstring + substr($string, $x, ($x+5)) + '\n';
                $x = $x + 5;
            }
            

            【讨论】:

            • 1.加法是 Perl 中的一种数学运算,即使在字符串上也是如此;你想要字符串连接运算符'.'。 2. substr 的第三个参数是子字符串的长度,而不是子字符串末尾的偏移量。 3. 换行必须用双引号:"\n"; '\n' 是文字字符串 \n。 4.你的while循环中的测试是向后的;它应该是 while(length($string)>$x).
            【解决方案8】:

            只需通过这个正则表达式传递你的字符串:

            =~ s/([^\n]{5})/$1\n/g
            

            你应该没事的。

            如果您真正拥有的不是随机字符的随机字符串,而是文本 - 您可能希望使用 Text::Wrap 模块。

            【讨论】:

            • {5} 不正确;这将删除所有剩余的字符。
            • @RobertP - “drop”是什么意思?回声“123456789” | perl -pe 's/([^\n]{5})/$1\n/g' 显示正确的结果。
            • @RobertP - 不,它不会丢弃剩菜,因为它不匹配:-D
            • 如果不匹配则不会添加最后的\n;他想要在每组字符的末尾换行。
            • @RobertP: quote: "add a newline character after every 5 characters" - 如果字符数不能被除以,它不会说明在最后 2 或 3 个字符后添加换行符5.
            【解决方案9】:
            echo 123456789abcd|perl -ne'print "$1\n" while s/(^.{5})//;print;'
            

            【讨论】:

            • 查看其他“.{5}”正则表达式答案;你会丢掉剩菜。
            • 使用单行程序的奖励积分 :) 我总是对有多少人不知道 perl -ne 感到惊讶。 (参见“perldoc perlrun”)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-12-01
            • 1970-01-01
            • 2011-10-14
            • 1970-01-01
            • 2020-12-21
            相关资源
            最近更新 更多